{"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":"a39fefdf-a26f-4b9f-be2e-f8efd7fcd7c4","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"c59ac8820250c27e2bacd57ae34616015e961457c2e7539a48d58d32d66ca416","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":"4c2dfc77f8095248f6fc64f58275cda7606701e98b495400312ad859b8001fa0","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"working"}],"objective":"Launch the Sworn registry (symbol SWORN) from this repository on Sepolia as a rehearsal of the mainnet launch, deployed in this order and with no other contracts: Renderer (no constructor arguments), Composer (no constructor arguments), then Registry with constructor arguments curator 0x0919ba50b206c3f31d516de818b1fbc7da21653d, idmd 0x2c3013c90a1bb65573aae9a7c64fafb82697e4e4, imd 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a (Sepolia test IMD), intake 0xa43e6f75ee006411f79ac1c84120606c2330de82 (Intake v2), attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982 (the IMD oracle signer), renderer $contract:Renderer, composer $contract:Composer, burnExecutor 0x0000000000000000000000000000000000000000 (no BurnExecutor on Sepolia: the burn rule is off). The contracts have no owner roles. Do not change contract logic; report every change the adapt step makes.","parentJobId":null,"planHash":"c7f3015a7cbd5b51cafea0d672b7f3c80f72f0ec80758667582acf9f6b515a99","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"a39fefdf-a26f-4b9f-be2e-f8efd7fcd7c4","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1936-launch-sworn-registry-symbol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52335","feedbackHash":"2938687837e86dbd5781f479b7c3f1a85747af719bfa97cbfbcac2e597d52ca6","nodeKey":"adapt_contract_project","submissionHash":"c59ac8820250c27e2bacd57ae34616015e961457c2e7539a48d58d32d66ca416","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52166","feedbackHash":"9eb66edb889a95aa28daaab1eaa8f466e5a989a59b8182e6762fbfa2645eddf4","nodeKey":"audit_imported_code","submissionHash":"4c2dfc77f8095248f6fc64f58275cda7606701e98b495400312ad859b8001fa0","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"ff047675a27d2993bdb28ac5fe8fbcc69408a3a714ec9989cc444dddb91258b8","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d317cdd61f845fb5","findings":[],"hash":"2b90c089df0a3f5849b22db0c54bb2c4c6df1ea7317971008dbc45b26f219351","nodeId":"6dea329a-7dad-42dd-8918-c35b824e7377","outcome":"failed","summary":"needs input: The launch_manifest validator rejects Registry constructor argument 7 (burnExecutor_) because it is zero, but the approved Sepolia brief explicitly requires 0x0000000000000000000000000000000000000000 to disable burning. The accepted Registry implementation supports this value, and the existing manifest matches every approved constructor argument. No manifest-only change can satisfy both the brief and the reported validator restriction. forge build passed; forge test with the supplied fuzz seed passed 175 tests, failed none, and skipped 17 fork tests. No contract, configuration, or manifest changes were made. — Can the launch_manifest validator be corrected to permit Registry.burnExecutor_ = 0x0000000000000000000000000000000000000000 as the explicitly approved burn-disabled setting for this Sepolia rehearsal?","treeHash":null,"usage":{"cachedInputTokens":980864,"inputTokens":80303,"model":"gpt-6-astra","outputTokens":9783,"runtime":"codex","turns":10,"wallClockMs":502123}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7f1dec5ffcbde1d8","findings":[{"citation":"resolved","description":"The launch's protected test (Contracts.protected.t.sol) deploys the three applications through the factory on a chain where nothing else exists: no code at the curator, IDMD, IMD or Intake addresses. The Registry constructor makes two live external calls, `curator.isSettled()` and `IIntake(intake_).priceOf(ACTION, imd_)`. A high-level call to an address without code reverts, so the Registry's CREATE2 fails and the probe stops with \"application 2 constructor failed\": the launch parks before anything reaches Sepolia, even though the live Sepolia curator (0x0919ba50...) reports isSettled() == true and the Intake quotes 0.5 TestIMD (both checked by eth_call on Sepolia during this review). Line 198 (`burnExecutor_.code.length == 0` -> ExecutorHasNoCode) has the same effect for the mainnet launch, where the executor is nonzero; on Sepolia it is zero and does not fire. The launch recipe says exactly this: a constructor that calls another contract or requires code at an address reverts on the floor; take the addresses as arguments and check the live contract on first use. Fix for the adapter: drop the two require calls (and the executor code check) from the constructor; the first `_price`/`_fromPool`/`hasTrait` call already fails loudly against a wrong address, or add an explicit one-time check in the first state-changing call. Note the Registry runtime is 24,495 bytes (81 bytes under EIP-170), so any added code must be offset.","line":200,"path":"src/Registry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Registry} from \"src/Registry.sol\";\nimport {Renderer} from \"src/Renderer.sol\";\nimport {Composer} from \"src/Composer.sol\";\n\n/// @notice The launch's protected floor deploys the three applications on an empty chain: the factory is\n///         etched, nothing else exists at any address. The Registry constructor calls `curator.isSettled()`\n///         and `intake.priceOf(...)` on addresses that hold no code there, so the constructor reverts and\n///         the launch parks (\"application 2 constructor failed\"). This test fails on the current code and\n///         passes once the constructor stops calling its dependencies (checking them on first use instead).\ncontract EmptyChainDeployTest is Test {\n    address constant FACTORY = 0x00000000000000000000000000000000000fAc70;\n    address constant CURATOR = 0x0919ba50b206C3F31D516De818b1fBc7dA21653D;\n    address constant IDMD = 0x2C3013c90a1Bb65573aae9a7C64fafB82697E4e4;\n    address constant IMD = 0x44a1Cd38474FB1748400E7DEb5F8D786ccE3F89A;\n    address constant INTAKE = 0xa43e6F75ee006411F79Ac1C84120606C2330DE82;\n    address constant ATTESTER = 0x5598Aa9146215Bc13eb26f2c692Ad1461Fd32982;\n\n    function test_registryConstructsOnAnEmptyChainLikeTheLaunchFloor() public {\n        vm.chainId(11155111);\n        assertEq(CURATOR.code.length, 0, \"precondition: no curator code on the rehearsal chain\");\n        assertEq(INTAKE.code.length, 0, \"precondition: no intake code on the rehearsal chain\");\n        vm.startPrank(FACTORY);\n        Renderer renderer = new Renderer();\n        Composer composer = new Composer();\n        Registry registry =\n            new Registry(CURATOR, IDMD, IMD, INTAKE, ATTESTER, address(renderer), address(composer), address(0));\n        vm.stopPrank();\n        assertGt(address(registry).code.length, 0, \"registry runtime missing\");\n        assertEq(address(registry.curator()), CURATOR);\n        assertEq(address(registry.intake()), INTAKE);\n    }\n}","reproduction":"State: chain 11155111, no code at 0x0919ba50b206c3f31d516de818b1fbc7da21653d (curator) or 0xa43e6f75ee006411f79ac1c84120606c2330de82 (intake), as on the protected floor. Call: new Registry(0x0919ba50..., 0x2c3013c9..., 0x44a1cd38..., 0xa43e6f75..., 0x5598aa91..., <Renderer>, <Composer>, 0x0). Expected: the registry deploys and the floor's checks run. Actual: the staticcall to 0x0919ba50...::isSettled() reverts with 'call to non-contract address' and the whole deployment reverts (forge trace: `[Revert] call to non-contract address 0x0919ba50b206C3F31D516De818b1fBc7dA21653D`). Run: forge test --match-path test/scratch/EmptyChainDeploy.t.sol","severity":"high","snippet":"        require(curator.isSettled(), \"Curator not settled\");\n        require(IIntake(intake_).priceOf(ACTION, imd_) != 0, \"Intake price\");","title":"Registry constructor calls the Curator and the Intake, so it reverts on the launch's empty-chain floor and parks the launch"},{"citation":"resolved","description":"Every question the Composer produces is about Ethereum mainnet: the body carries `\"chainId\": 1` and the text says 'on Ethereum mainnet', and the pinned windows are mainnet blocks (0x189378e..0x18984a4). The protocol defines Attestation.chainId as the chain the question is about, not the consumer's chain (oracle-consumer REFERENCE.md: 'The chain the question is *about* ... Not necessarily the consumer's chain, which is in the domain instead'), so the attestation for any registry question carries chainId = 1. `_check` returns reason 3 whenever `a.chainId != block.chainid`; on the Sepolia rehearsal block.chainid is 11155111, so every delivered answer is `Missed(requestId, traitId, 3)` after the 0.5 TestIMD was spent and the pending pair cleared. Independently, Composer.encodeBody (src/Composer.sol:555) writes `\"consumer\": {\"chainId\": 1, \"verifyingContract\": <registry>}` regardless of the deployment chain; INTEGRATION.md section 4 says the plane takes the signing domain from that field, while `attestationDigest` uses `block.chainid` (11155111) in its domain, so even a signer that honoured the body would produce a signature the registry rejects (reason 2), and the Sepolia Intake, which only serves answers signed for a Sepolia contract, may refuse the body outright (status 1 -> NoVerdict, price spent). Net effect: the rehearsal can exercise mintCard, upgrade, registerSpec and the pool paths, but no `onResult` can ever succeed on Sepolia, so Verified/_mark/cardOf-with-oracle-traits are never rehearsed, and every TestIMD paid for a request is lost. The mainnet deployment is unaffected only because both chains coincide at 1. Adapter options: compare `a.chainId` with the question's chain (the constant 1 the body already carries) instead of `block.chainid`, and write `block.chainid` into the body's consumer.chainId; or state in the report that the Sepolia rehearsal cannot cover the oracle path.","line":540,"path":"src/Registry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Registry} from \"src/Registry.sol\";\nimport {Renderer} from \"src/Renderer.sol\";\nimport {Composer} from \"src/Composer.sol\";\nimport {IIntake} from \"src/interfaces/IIntake.sol\";\nimport {OracleAttestation} from \"src/interfaces/IOracleConsumer.sol\";\n\ncontract SepoliaMockCurator {\n    function isSettled() external pure returns (bool) {\n        return true;\n    }\n\n    function firstHourOf(address) external pure returns (uint256, bool) {\n        return (0, false);\n    }\n\n    function txCountOf(address) external pure returns (uint256) {\n        return 0;\n    }\n\n    function contributedBy(address) external pure returns (uint256) {\n        return 0;\n    }\n\n    function pointsOf(address) external pure returns (uint256) {\n        return 0;\n    }\n}\n\ncontract SepoliaMockIDMD {\n    function balanceOf(address) external pure returns (uint256) {\n        return 0;\n    }\n\n    function ownerOf(uint256) external pure returns (address) {\n        return address(0);\n    }\n}\n\ncontract SepoliaMockIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\ncontract SepoliaMockIntake {\n    uint256 internal nonce;\n    bytes32 public lastId;\n    address public target;\n    bytes4 public selector;\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        IIntake.Callback calldata callback,\n        bytes4,\n        address asset,\n        uint256 amount\n    ) external payable returns (bytes32 requestId) {\n        SepoliaMockIMD(asset).transferFrom(msg.sender, address(this), amount);\n        requestId = keccak256(abi.encode(++nonce));\n        lastId = requestId;\n        target = callback.target;\n        selector = callback.selector;\n    }\n\n    /// @dev Delivers as Intake v2 `complete` does: the stored selector, 200,000 gas, inside a try.\n    function complete(bytes calldata args) external returns (bool ok) {\n        (ok,) = target.call{gas: 200_000}(abi.encodePacked(selector, args));\n    }\n}\n\n/// @notice On the Sepolia rehearsal (chain 11155111) every question the registry composes is about Ethereum\n///         mainnet (`\"chainId\": 1` in the body), so the attestation the oracle signs carries `chainId = 1`:\n///         the chain the question is about, not the consumer's chain. `Registry._check` compares that field\n///         with `block.chainid` and returns reason 3, so every paid request on Sepolia is `Missed` and no\n///         oracle trait can ever be verified there. Fails on the current code; passes once check 3 compares\n///         the attestation's chain with the question's chain (1) instead of the deployment chain.\ncontract SepoliaChainIdTest is Test {\n    uint256 constant ATTESTER_KEY = 0xA11CE;\n    uint64 constant B_H24 = 0x1895395;\n    uint64 constant B_END = 0x18984a4;\n\n    SepoliaMockIMD imd;\n    SepoliaMockIntake intake;\n    Registry registry;\n    address claimant = address(0xC1A1);\n\n    event Missed(bytes32 requestId, uint16 traitId, uint8 reason);\n\n    function setUp() public {\n        vm.chainId(11155111);\n        vm.warp(1_791_700_000);\n        vm.roll(9_900_000);\n        SepoliaMockCurator curator = new SepoliaMockCurator();\n        SepoliaMockIDMD idmd = new SepoliaMockIDMD();\n        imd = new SepoliaMockIMD();\n        intake = new SepoliaMockIntake();\n        Renderer renderer = new Renderer();\n        Composer composer = new Composer();\n        registry = new Registry(\n            address(curator),\n            address(idmd),\n            address(imd),\n            address(intake),\n            vm.addr(ATTESTER_KEY),\n            address(renderer),\n            address(composer),\n            address(0)\n        );\n    }\n\n    function test_mainnetQuestionAnsweredOnSepoliaVerifies() public {\n        imd.mint(claimant, 0.5 ether);\n        vm.startPrank(claimant);\n        imd.approve(address(registry), type(uint256).max);\n        uint16[] memory ids = new uint16[](1);\n        ids[0] = 701;\n        registry.upgrade(ids, 0.5 ether);\n        vm.stopPrank();\n        bytes32 requestId = intake.lastId();\n        (,,, bytes32 qh) = registry.pendingRequest(requestId);\n\n        // The body the registry just sent asks about Ethereum mainnet.\n        (bytes memory body,) = registry.composeBody(701, claimant);\n        assertTrue(_contains(body, bytes('\"chainId\": 1,')), \"the composed question is about chain 1\");\n\n        OracleAttestation memory a;\n        a.requestId = keccak256(\"uuid\");\n        a.chainId = 1; // the chain the question is about, as the protocol defines the field\n        a.questionHash = qh;\n        a.answerType = 3;\n        a.answer = abi.encode(uint256(1));\n        a.fromBlock = B_H24;\n        a.toBlock = B_END;\n        a.blockHash = keccak256(\"block\");\n        a.panelJobId = keccak256(\"panel\");\n        a.panelSize = 5;\n        a.quorum = 3;\n        a.agreed = 3;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 30 days);\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(ATTESTER_KEY, registry.attestationDigest(a));\n        bytes memory sig = abi.encodePacked(r, s, v);\n\n        bool delivered = intake.complete(abi.encode(requestId, a, sig));\n        assertTrue(delivered, \"callback reverted\");\n        assertTrue(registry.hasTrait(claimant, 701), \"a correctly signed mainnet answer was Missed on Sepolia\");\n    }\n\n    function _contains(bytes memory hay, bytes memory needle) internal pure returns (bool) {\n        if (needle.length > hay.length) return false;\n        for (uint256 i; i + needle.length <= hay.length; ++i) {\n            bool ok = true;\n            for (uint256 j; j < needle.length; ++j) {\n                if (hay[i + j] != needle[j]) {\n                    ok = false;\n                    break;\n                }\n            }\n            if (ok) return true;\n        }\n        return false;\n    }\n}","reproduction":"State: chain 11155111; registry deployed with a settled curator and an intake quoting 0.5 IMD; claimant approves 0.5 IMD. Calls: registry.upgrade([701], 0.5e18) -> pending (requestId, questionHash qh). The oracle's answer for that question: chainId = 1, questionHash = qh, answerType 3, answer = abi.encode(1), fromBlock 0x1895395, toBlock 0x18984a4, panelSize 5, quorum 3, agreed 3, issuedAt now, expiresAt now + 30 days, signed by the attester over registry.attestationDigest(a). Intake calls registry.onResult(requestId, a, sig) with 200,000 gas. Expected: Verified(claimant, 701, ...) and hasTrait(claimant, 701) == true. Actual: emit Missed(requestId, 701, 3); hasTrait stays false; the 0.5 IMD is gone. Also: registry.composeBody(701, claimant) on chain 11155111 returns a body containing `\"consumer\": {\\n    \"chainId\": 1`. Run: forge test --match-path test/scratch/SepoliaChainId.t.sol","severity":"medium","snippet":"        if (a.chainId != block.chainid) return 3;","title":"On Sepolia every oracle answer is Missed (reason 3): check 3 compares the question's chain (1) with block.chainid (11155111), and the body pins the consumer domain to chain 1"},{"citation":"resolved","description":"`abandon` has no caller check: 14 days after a request, any address can clear the pending pair. A late delivery after that is treated as an unknown id (`Missed(requestId, 0, 1)`) and stores nothing, so the claimant's 0.5 IMD buys no trait. The oracle-consumer reference asks for a deadline after which 'its requester can clear it'. Documented as 'callable by anyone' in CATALOG.md, so this is a design choice with a griefing edge, not a fund-loss path: the griefer gains nothing except denying the trait, and the claimant can pay again.","line":411,"path":"src/Registry.sol","reproduction":"State: claimant A calls upgrade([801], 0.5e18) at time T; the plane has not completed by T + 14 days. Call: attacker B (any EOA) calls abandon(requestId) at T + 14 days, in the block before the Intake's complete(). Expected (per the reference): only A can release A's request. Actual: Abandoned(requestId) is emitted, _pending is deleted; the Intake's onResult then emits Missed(requestId, 0, 1) and A has neither the trait nor the 0.5 IMD. (Existing test test/Registry.t.sol covers abandon-after-14-days by the claimant; call it from a different pranked address to see it succeed.)","severity":"low","snippet":"    function abandon(bytes32 requestId) external {\n        Pending memory p = _pending[requestId];\n        if (p.requestedAt == 0) revert NotPending(requestId);\n        if (block.timestamp < uint256(p.requestedAt) + ABANDON_AFTER) revert TooEarly();\n        _clear(requestId, p);\n        emit Abandoned(requestId);\n    }","title":"abandon() is callable by anyone, so a third party can discard a claimant's late but valid answer"},{"citation":"resolved","description":"The oracle-consumer reference says the intake, action id, asset/price and signer must be constructor input and owner-settable so that a new action version (oracle-2) or a rotated signer does not need a redeploy. The brief forbids owner roles, so the registry hard-codes ACTION and keeps `attester`, `intake`, `imd` in storage with no setter. This is a trust assumption the adapter cannot remove without an owner, but it should be stated: (a) if the Intake stops selling `oracle.request@oracle-1` in IMD, `_price` returns 0 and `upgrade`/`_fromPool` pass amount 0 to requestWithFailure, which the Intake refuses (ActionNotSold), so no new oracle trait can ever be requested; (b) if the IMD oracle rotates its signing key, every attestation is Missed with reason 2. Pool money and mint fees already inside the registry then have no way out. Report as a known limitation rather than a change request.","line":59,"path":"src/Registry.sol","reproduction":"State: Intake owner sets priceOf(bytes32('oracle.request@oracle-1'), imd) = 0 (or lists only 'oracle.request@oracle-2'). Call: upgrade([701], maxPrice) -> _price returns 0, safeTransferFrom(0) succeeds, requestWithFailure(..., amount 0) reverts in the Intake; claimSponsored(701) -> PoolTooSmall is not hit (0 <= balance) and the same Intake revert follows. Expected: a way to point at the new action/signer. Actual: no function changes ACTION, attester, intake or imd; the registry's IMD balance (pool) is stranded.","severity":"low","snippet":"    bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");","title":"Action id and attester are fixed for ever: an oracle action or signer rotation freezes every oracle trait with no repair path"},{"citation":"resolved","description":"`run()` only switches the burn executor to zero on Sepolia; the curator, IDMD, IMD and intake stay the mainnet constants. The brief gives different Sepolia addresses for the curator (0x0919ba50...), IDMD (0x2c3013c9...) and IMD (0x44a1cd38...). With the mainnet curator address the constructor's `curator.isSettled()` call hits an address without code on Sepolia and reverts. The launch manifest, not this script, is the deployment path, so this is informational for the adapter: the constructor arguments must come from the brief, and the script should not be used as the source of the Sepolia addresses.","line":25,"path":"script/Deploy.s.sol","reproduction":"State: a Sepolia fork (chain 11155111). Call: Deploy.run(). Expected: a registry wired to the brief's Sepolia dependencies. Actual: new Registry(0xcB0b0531..., 0x0000eC93..., 0xD34a99Bc..., ...) reverts at curator.isSettled() because 0xcB0b0531e86A9aC36Fa865cA8e3dbccF047FDA91 has no code on Sepolia (cast code on Sepolia returns 0x).","severity":"low","snippet":"            deploy(CURATOR, IDMD, IMD, INTAKE_V2, ATTESTER, block.chainid == 11155111 ? address(0) : BURN_EXECUTOR);","title":"Deploy.s.sol run() on chain 11155111 passes the mainnet Curator/IDMD/IMD addresses, which have no code on Sepolia"},{"citation":"resolved","description":"forge build --sizes reports Registry runtime 24,495 B (margin 81 B), Composer 23,377 B, Renderer 21,570 B, all with bytecode_hash = none and cbor_metadata = false. The protected floor's opcode scan (no 0xf2/0xf4/0xff outside PUSH data) passes for all three runtimes (checked with test/scratch/OpcodeScan.t.sol, reviewer's check only). Removing the constructor's external calls (finding 1) shrinks the runtime slightly; any adapt change that adds logic to Registry risks exceeding 24,576 bytes and failing the floor's size bound.","line":31,"path":"src/Registry.sol","reproduction":"Run forge build --sizes on this tree: Registry | 24,495 | margin 81. Add 82 bytes of runtime code to Registry and the protected test's assertLe(code.length, 24_576) fails.","severity":"info","snippet":"contract Registry is ERC721, IERC4906, ReentrancyGuard, IOracleConsumer {","title":"Registry runtime is 24,495 bytes, 81 bytes under EIP-170; the adapt step has almost no room to add code"}],"hash":"4c2dfc77f8095248f6fc64f58275cda7606701e98b495400312ad859b8001fa0","nodeId":"8887db53-ed2c-47c8-b73b-cc0ae7efe6a2","outcome":"completed","summary":"The review is complete and the findings file holds six entries, two with Foundry proofs that fail on the current tree.\n\n**Outcome.** The contracts are sound as application logic, but the launch as briefed cannot proceed without one change, and the Sepolia rehearsal cannot exercise the oracle path at all.\n\n**Findings written to .imd-findings.json**\n\n- **High, with proof.** The Registry constructor calls the Curator and the Intake. The protected floor deploys on an empty chain, so the call to the curator address reverts and the launch parks with \"application 2 constructor failed\". The trace shows the revert at the `isSettled()` staticcall. Both live Sepolia contracts answer correctly, so only the floor is affected. The fix is to drop the constructor calls and check dependencies on first use.\n- **Medium, with proof.** On Sepolia every oracle answer is Missed with reason 3. Check 3 compares the attestation's chain, which is the question's chain (1, mainnet facts), against the deployment chain 11155111. The composed body also pins the consumer domain to chain 1 while the registry's digest uses chain 11155111. No `onResult` can ever succeed in the rehearsal and each paid request loses 0.5 TestIMD.\n- **Low.** Anyone can call `abandon` after 14 days, so a third party can discard a late valid answer.\n- **Low.** The action id and attester are fixed with no rotation path. This follows from the no-owner brief, reported as a trust assumption.\n- **Low.** The deploy script passes mainnet Curator, IDMD and IMD addresses on Sepolia, which have no code there.\n- **Info.** Registry runtime is 24,495 bytes, 81 bytes under the EIP-170 limit, so the adapter has almost no room to add code.\n\n**Launch-forbidden checks.** No pause, freeze, blacklist, seizure, DELEGATECALL, CALLCODE, SELFDESTRUCT, proxy, initializer or post-deployment setter exists. The opcode and size scan passes for all three runtimes. Card minting is the application's purpose, not a token supply.\n\n**Coverage.** Read in full: Registry, Composer, Renderer, Types, HiveData, TemplateData, all five interfaces, the Deploy script, both protected tests, both skill references, and the Intake v2 reference's request and complete paths. The existing suite passes with 164 tests. Live Sepolia eth_calls confirmed the curator is settled, its five views respond, the Intake quotes 0.5 TestIMD with a 1,000,000 gas callback stipend, and IDMD has code.\n\n**Not reached.** The owner-check base contract `floor/OwnerChecks.sol` is not in the tree. The plane's exact behaviour for a Sepolia request naming a chain-1 consumer could not be observed, so the medium finding states both failure routes. The burn executor path is off on Sepolia and was reviewed by reading only. The fork tests were skipped as they need an RPC variable.","treeHash":null,"usage":{"cachedInputTokens":1626373,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":39213,"runtime":"claude","turns":38,"wallClockMs":601825}},{"artifacts":[],"attempt":1,"bundleHash":"81003815ad7726a6f41c59740965e2d343fdfea6a1207d5ee346c1279d4c438e","device":"4da6f73105193824","findings":[],"hash":"c59ac8820250c27e2bacd57ae34616015e961457c2e7539a48d58d32d66ca416","nodeId":"09585758-ac83-470b-ad9b-a32345045967","outcome":"completed","summary":"Implemented the Sepolia launch adaptation and audit fixes. Every change, constructor argument and retained limitation is documented in [ADAPTATION.md](/home/imd/.identitymd/work/a39fefdf-a26f-4b9f-be2e-f8efd7fcd7c4/09585758-ac83-470b-ad9b-a32345045967/ADAPTATION.md).\n\nValidation passed:\n\n- `forge build`\n- Seeded `forge test`: 177 passed, 0 failed, 17 optional fork tests skipped.\n- Empty-chain factory rehearsal passed.\n\nRegistry remains within EIP-170 with 15 bytes of headroom. No contracts were broadcast.","treeHash":"82adfa26545d81cce2db2559c50d435710beb0fe","usage":{"cachedInputTokens":2529408,"inputTokens":117871,"model":"gpt-6-astra","outputTokens":24811,"runtime":"codex","turns":7,"wallClockMs":794937}}],"verification":[{"checks":[{"durationMs":15525,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.24\nSolc 0.8.24 finished in 15.07s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/mocks/MockBurnExecutor.sol:10:9:\n   |\n10 |         selfdestruct(payable(to));\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/Goldens.t.sol:67:5:\n   |\n67 |     function _widthCard() internal view returns (Card memory c) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/Goldens.t.sol:345:5:\n    |\n345 |     function _card(\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":14356,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/fork/BurnRule.fork.t.sol:BurnRuleForkTest\n[SKIP] test_fork_coldFreeClaimExactFeeFromNonpayableContractClaimant() (gas: 0)\n[SKIP] test_fork_coldFreeClaimWithSurplusBurnsAndExecutorReturnsTheSurplus() (gas: 0)\n[SKIP] test_fork_coldFreeClaimWithoutTheFeeReverts() (gas: 0)\n[SKIP] test_fork_executorConfigurationAndPinnedQuote() (gas: 0)\n[SKIP] test_fork_realExecutorAndOFTForceRefundSurplusToNonpayableRecipient() (gas: 0)\n[SKIP] test_fork_realExecutorExactFeeForNonpayableRecipient() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 6 skipped; finished in 556.42µs (410.66µs 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 584.56µs (741.91µs CPU time)\n\nRan 9 tests for test/Launch.t.sol:LaunchBehaviorTest\n[PASS] test_retiredActionRejectsRequestsAndLeavesPool() (gas: 641296)\n[PASS] test_rotatedSignerIsRejected() (gas: 1634462)\n[PASS] test_sepoliaAcceptsMainnetAnswerUnderColdCallbackStipendWithCard() (gas: 2156046)\n[PASS] test_sepoliaBodySeparatesQuestionChainAndConsumerChain() (gas: 257945)\n[PASS] test_sepoliaCommunityAndSharedAnswersUseMainnetQuestionChain() (gas: 4000216)\n[PASS] test_sepoliaRejectsASignatureForTheMainnetConsumerDomain() (gas: 1632292)\n[PASS] test_sepoliaRejectsAnAnswerAboutSepoliaEvenWithAValidSignature() (gas: 1625456)\n[PASS] test_sponsoredClaimantAloneCanAbandonAfterDeadline() (gas: 1675286)\n[PASS] test_thirdPartyCannotDiscardALateValidPersonalAnswer() (gas: 1743995)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 10.67ms (10.45ms CPU time)\n\nRan 10 tests for test/ReReview.t.sol:ReReviewTest\n[PASS] test_coldGas_firstCommunityVerificationWithACard() (gas: 2415567)\nLogs:\n  cold onResult gas, first community verification with a card: 133357\n\n[PASS] test_coldGas_sharedFact64Catalog() (gas: 1739960)\nLogs:\n  cold onResult gas, 64-address shared fact (catalog 1201): 164088\n\n[PASS] test_coldGas_sharedFact64Community() (gas: 2108990)\nLogs:\n  cold onResult gas, 64-address shared fact (community T3): 170446\n\n[PASS] test_communityAttributesAppearOnlyForVerifiedSpecs() (gas: 4751553)\n[PASS] test_constructorDoesNotCallIsSettled() (gas: 163502)\n[PASS] test_hugeSignatureOnCommunitySharedFactAndCardRequestClearsUnderStipend() (gas: 12243096)\n[PASS] test_lowerOrdinalAcquiredLaterReplacesTheHigherOne() (gas: 8479392)\n[PASS] test_sameSignedEvidenceSatisfiesAnotherRequestWithTheSameQuestion() (gas: 3262641)\n[PASS] test_specIdsEndAt65534() (gas: 909575)\n[PASS] test_unusedFixedValIsRefusedAndAnEmptyFilterIsNotSerialised() (gas: 1334433)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 40.40ms (37.86ms CPU time)\n\nRan 1 test for test/Launch.t.sol:SepoliaLaunchTest\n[PASS] test_factoryDeploysOnlyTheThreeApplicationsOnEmptySepolia() (gas: 72505785)\nLogs:\n  three-contract factory deployment gas: 15679636\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 94.05ms (93.90ms CPU time)\n\nRan 6 tests for test/Templates.t.sol:TemplatesTest\n[PASS] test_allTenBodiesAreByteExact() (gas: 1456996)\n[PASS] test_allTenQuestionHashesEqualThePlanes() (gas: 2185240)\n[PASS] test_bodyIsDeterministicInClaimantAndDiffersAcrossClaimants() (gas: 464062)\n[PASS] test_directAndUnknownIdsHaveNoBody() (gas: 60735)\n[PASS] test_hexMinAndCatalogWindows() (gas: 146951)\n[PASS] test_traitNamesAndClasses() (gas: 112489)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 210.27ms (12.61ms CPU time)\n\nRan 15 tests for test/RegistryRules.t.sol:RegistryRulesTest\n[PASS] test_fuzz_bothPoolPathsShareOneAllowancePerUtcDay(bool,bool,uint32) (runs: 256, μ: 3246614, ~: 3269807)\nLogs:\n  Bound result 19947\n\n[PASS] test_idmdCounterFollowsTransfersAndStopsAtNine() (gas: 15433262)\n[PASS] test_idmdHolderMustAlsoBeAListMember() (gas: 1763885)\n[PASS] test_memberClaimsOnDeploymentDayWithoutCardOrIdmd() (gas: 1674869)\n[PASS] test_noVerdictConsumesTheDayAndLifetimePair() (gas: 3269304)\n[PASS] test_paidUpgradeAndSharedFactDoNotUseOrObeyPoolDailyLimit() (gas: 8188766)\n[PASS] test_priceReadOnUseIsPassiveAndConstructorDoesNotReadPrice() (gas: 1040534369)\n[PASS] test_revertingIntakeDoesNotConsumePoolAllowances() (gas: 2028350)\n[PASS] test_specAndFirstClaimCostSixPointNineIMD() (gas: 1880778)\n[PASS] test_specRequiresFullFeeAndAllowance() (gas: 798772)\n[PASS] test_sponsoredUpgradeRequiresExactlyOneTrait() (gas: 1780238)\n[PASS] test_switchingIdmdDoesNotBypassDailyLimit() (gas: 3191898)\n[PASS] test_unavailableIntakeIsRejectedOnUse() (gas: 102102)\n[PASS] test_wrongAssetIsRejectedOnUse() (gas: 716819)\n[PASS] test_zeroIntakePriceIsRejectedOnUse() (gas: 212428)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 239.05ms (249.84ms CPU time)\n\nRan 8 tests for test/Rename.t.sol:RenameTest\n[PASS] test_catalogSpecNamesMatchTheTable() (gas: 495517)\n[PASS] test_collectionNameAndSymbol() (gas: 25005)\n[PASS] test_composerStaysUnderTheSizeLimitWithHeadroom() (gas: 13473)\n[PASS] test_metadataCarriesTheFinalFamilyNames() (gas: 3753859)\n[PASS] test_nameTableIsTheFinalTable() (gas: 609580)\n[PASS] test_noWorkingNameSurvivesInTheNameTable() (gas: 1060323)\n[PASS] test_unknownIdHasNoName() (gas: 25179)\n[PASS] test_upgradeRefusesTopWeightsAsASharedFact() (gas: 1641356)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 322.39ms (16.49ms CPU time)\n\nRan 25 tests for test/Registry.t.sol:RegistryTest\n[PASS] test_abandonOnlyAfterFourteenDaysAndStaleCallbackLeavesSuccessor() (gas: 3333629)\n[PASS] test_anyoneReadsAnyWalletAndNothingUsesTxOrigin() (gas: 1943609)\n[PASS] test_attestationForAnotherConsumerOrChainIsNeverAccepted() (gas: 3213484)\n[PASS] test_callbacksRejectEveryoneButTheIntake() (gas: 1630144)\n[PASS] test_claimSponsoredRules() (gas: 5263554)\n[PASS] test_directTraitsAreLiveAndNeedNoCard() (gas: 606480)\n[PASS] test_fuzz_tiersAreMonotone(uint8,bool,uint32,uint128,uint32,uint8) (runs: 256, μ: 712917, ~: 709510)\n[PASS] test_malformedEnvelopeIsNotDeliveredAndStaysPending() (gas: 1561002)\n[PASS] test_mintOncePerWalletAndTransfersKeepClaimant() (gas: 956472)\n[PASS] test_mintWithoutFeeReverts() (gas: 47096)\n[PASS] test_missReasons() (gas: 29437089)\n[PASS] test_noReceiveOrFallback() (gas: 57774)\n[PASS] test_nonMemberIsNeverAnEarlyBird() (gas: 232815)\n[PASS] test_onFailureClearsAndAllowsRetry() (gas: 3005968)\n[PASS] test_onResultGasWorstCase() (gas: 2334276)\nLogs:\n  onResult worst-case gas: 164955\n\n[PASS] test_poolIsTheBalanceAndOnlyLeavesThroughSponsoredRequests() (gas: 5657418)\n[PASS] test_reentrantTokenCannotReenterMint() (gas: 2358744)\n[PASS] test_registerSpecAssignsSequentialIdsAndIsImmutable() (gas: 1231885)\n[PASS] test_sharedFactBadEnvelopeIsAMissAndCanBeRequestedAgain() (gas: 6924559)\n[PASS] test_sharedFactFlow() (gas: 2477894)\n[PASS] test_specGuards() (gas: 1337022)\n[PASS] test_supportsERC4906AndERC721() (gas: 25952)\n[PASS] test_upgradeGuards() (gas: 6034510)\n[PASS] test_upgradeHappyPathMarksTraitAndRefreshesCard() (gas: 2537251)\n[PASS] test_upgradeWithoutCardAttachesToClaimant() (gas: 1895072)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 322.47ms (135.69ms CPU time)\n\nRan 32 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_abandonedPoolRequestKeepsPoolUsedAndLateCallbackIsIgnored() (gas: 1763405)\n[PASS] test_abandonedSharedFactCanBeRequestedAgainAndTheLateAnswerIsIgnored() (gas: 3060687)\n[PASS] test_attestationForAnotherClaimantIsAMissForThisRequest() (gas: 3243937)\n[PASS] test_attestationForAnotherTraitWithTheSameWindowIsAMiss() (gas: 3246988)\n[PASS] test_callbackStarvedOfGasIsNotDeliveredAndStaysPending() (gas: 1692772)\n[PASS] test_cardShowsAtMostThirtyTwoCommunityIdsAndCountsThemAll() (gas: 86215648)\n[PASS] test_claimSponsoredWhilePendingOrVerifiedReverts() (gas: 2104349)\n[PASS] test_communityT3SpecIsASharedFactWithItsOwnHead() (gas: 2423000)\n[PASS] test_everyTemplateVerifiesUnderTheStipendWithACard() (gas: 11730108)\n[PASS] test_expiryAtTheExactSecondStillPassesAndOneLaterDoesNot() (gas: 3241176)\n[PASS] test_fuzz_anyFieldAlteredAfterSigningIsASignatureMiss(uint8,uint256) (runs: 512, μ: 1652608, ~: 1654322)\nLogs:\n  Bound result 2\n\n[PASS] test_fuzz_applySharedFactOnlyWithinTheHead(uint8,uint8) (runs: 256, μ: 1787026, ~: 1777153)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] test_fuzz_boolAnswerMustBeExactlyZeroOrOne(uint256) (runs: 512, μ: 2076227, ~: 2075589)\n[PASS] test_fuzz_countAnswerAgainstTheThreshold(uint256,bytes1,bool) (runs: 512, μ: 1654417, ~: 1625843)\n[PASS] test_fuzz_expiryAndClockSkewBoundaries(uint64,uint64) (runs: 512, μ: 1649696, ~: 1641278)\n[PASS] test_fuzz_hasTraitAndTraitsOfNeverRevert(address,uint16,uint8,bool,uint8) (runs: 512, μ: 326232, ~: 334246)\n[PASS] test_fuzz_maximalSpecRegistersComposesAndFitsTheBody(uint8,uint256,uint256) (runs: 64, μ: 2528678, ~: 2715060)\nLogs:\n  Bound result 2\n  Bound result 16566344215213813863514088324151821317644813493580890121915791162245250421\n\n[PASS] test_fuzz_panelAndQuorumBoundaries(uint16,uint16,uint16) (runs: 512, μ: 1654073, ~: 1640258)\n[PASS] test_fuzz_panelTraitNeedsElevenAndSeven(uint16,uint16,uint16) (runs: 512, μ: 2082267, ~: 2069243)\n[PASS] test_fuzz_specBodyIsDeterministicAndClaimantBound(address,address) (runs: 256, μ: 864570, ~: 864570)\n[PASS] test_fuzz_upgradeChargesExactlyKTimesPriceAndLeavesThePoolAlone(uint8,uint256) (runs: 256, μ: 5223988, ~: 4217853)\nLogs:\n  Bound result 8\n  Bound result 6449\n\n[PASS] test_fuzz_upgradeRejectsEveryIdThatIsNotAnOracleTrait(uint16) (runs: 256, μ: 209626, ~: 209262)\n[PASS] test_fuzz_windowMustEqualTheCanonicalOne(uint64,uint64) (runs: 512, μ: 1640819, ~: 1640809)\n[PASS] test_onFailureRecordsWhatItIsToldAndStoresNothing() (gas: 3064044)\n[PASS] test_questionHashIsBoundToTheClaimantAndTheTrait() (gas: 689833)\n[PASS] test_reentrantTokenCannotReenterAnyIMDMovingFunction() (gas: 7516833)\n[PASS] test_sharedFactWorstCaseEnvelopeUnderTheStipend() (gas: 3983678)\n[PASS] test_signatureShapesThatDoNotRecover() (gas: 9337010)\n[PASS] test_tokenURIDependsOnlyOnTheClaimantsFacts() (gas: 14703083)\n[PASS] test_traitClassForEveryCatalogIdAndRevertsForUnknown() (gas: 703103)\n[PASS] test_upgradeSponsoredDrawsAllNineOverNineDaysAndRefusesDuplicates() (gas: 12559912)\n[PASS] test_verifiedWindowIsTheCanonicalWindowForEveryOracleId() (gas: 16462663)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 322.59ms (2.26s CPU time)\n\nRan 19 tests for test/Goldens.t.sol:GoldensTest\n[PASS] test_escapeJsonNeutralisesMarkup() (gas: 42645)\n[PASS] test_goldenSyntheticCollector() (gas: 20831323)\n[PASS] test_goldenSyntheticDirect() (gas: 5079487)\n[PASS] test_goldenSyntheticFullhouse() (gas: 21514473)\n[PASS] test_goldenSyntheticHoney() (gas: 23746288)\n[PASS] test_goldenSyntheticNewcomer() (gas: 3219081)\n[PASS] test_goldenSyntheticOracle() (gas: 8916232)\n[PASS] test_goldenSyntheticOutsider() (gas: 5211326)\n[PASS] test_goldenSyntheticWidthThroughTheRenderer() (gas: 24718798)\n[PASS] test_imageCommunityPathFollowsTheStepTable() (gas: 13547491)\n[PASS] test_imageIdsOutsideTheCatalogRenderWithoutReverting() (gas: 763825)\n[PASS] test_imageIsPureAndDeterministic() (gas: 16076101)\n[PASS] test_imageOverflowPathAbsentAtOrBelow39AndNeverOverflows() (gas: 13459611)\n[PASS] test_imageRareDotOnlyAtATopTierRareId() (gas: 17170837)\n[PASS] test_imageRingsByCommunityCount() (gas: 5559349)\n[PASS] test_imageStepsUseExponentiationNotXor() (gas: 6674005)\n[PASS] test_reportRendererRuntimeSize() (gas: 129606)\nLogs:\n  Renderer runtime bytes: 21570\n\n[PASS] test_reportTokenURIGas() (gas: 29841499)\nLogs:\n  tokenURI gas synthetic_width: 10810085\n  tokenURI gas synthetic_fullhouse: 9147472\n  tokenURI gas synthetic_honey: 9589924\n\n[PASS] test_templateArtifactsMatchTheCompiledConstants() (gas: 297819)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 326.57ms (374.34ms CPU time)\n\nRan 24 tests for test/BurnRule.t.sol:BurnRuleTest\n[PASS] testFuzz_belowThresholdRefundsWithoutFee(bool,uint96,uint96) (runs: 256, μ: 1561169, ~: 1547362)\nLogs:\n  Bound result 233626465335063918\n  Bound result 265897516629384759\n\n[PASS] testFuzz_dueForwardsWholeValueAndExecutorForceRefunds(bool,uint96,uint96) (runs: 256, μ: 1830172, ~: 1816132)\nLogs:\n  Bound result 79228162445497964058879014254\n  Bound result 265897516629384759\n\n[PASS] testFuzz_dueWithoutEnoughFeeRevertsAtomically(bool,uint96,uint96) (runs: 256, μ: 3240108, ~: 3211183)\nLogs:\n  Bound result 79228162445264337705385177660\n  Bound result 71304613567861\n\n[PASS] testFuzz_failedPreviewOrBridgeSkipsAndRefunds(bool,uint8,uint96) (runs: 256, μ: 1771102, ~: 1597891)\nLogs:\n  Bound result 4\n  Bound result 15071304613567853\n\n[PASS] testFuzz_nonpayableContractWorksWithNoValueExactFeeAndSurplus(bool,uint8) (runs: 256, μ: 1945549, ~: 1976316)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_previewExceedingTheBudgetSkipsWithCodeOneAndRefunds(bool,uint96) (runs: 256, μ: 2165976, ~: 2150609)\nLogs:\n  Bound result 264337514315787821\n\n[PASS] testFuzz_quoteAboveCapSkipsWithCodeThree(bool,uint96,uint96) (runs: 256, μ: 1565042, ~: 1551036)\nLogs:\n  Bound result 233626465335063918\n  Bound result 265897516629384759\n\n[PASS] testFuzz_unsetExecutorDisablesBurnAndRefunds(bool,uint96) (runs: 256, μ: 1582662, ~: 1567348)\nLogs:\n  Bound result 264337514315787821\n\n[PASS] test_constantsAndStorage() (gas: 29216)\n[PASS] test_exactFeeAndCapAreInclusive() (gas: 1708522)\n[PASS] test_executorReentryIsGuarded() (gas: 1770433)\n[PASS] test_executorSurplusCallReentryIsGuarded() (gas: 2351802)\n[PASS] test_executorSurplusIsForcedOnARejectingRecipient() (gas: 1984874)\n[PASS] test_executorWithoutCodeDeploysButCannotProcessASponsoredClaim() (gas: 3387567)\n[PASS] test_existingChecksAndIntakeFailurePrecedeBurnFeeCheck() (gas: 579665)\n[PASS] test_gasArgumentsIncludeOnlyTheValueStipend() (gas: 1694311)\n[PASS] test_noFeeAtExactThresholdReverts() (gas: 1537187)\n[PASS] test_nonpayableContractAcceptsZeroRefundOnPreviewFailure() (gas: 1791251)\n[PASS] test_paidFunctionsRejectOneWeiWhereZeroValueSucceeds() (gas: 3763206)\n[PASS] test_previewUsingMostOfTheBudgetIsQuotedAndBurns() (gas: 2236677)\n[PASS] test_registryRefundReentryIsGuarded() (gas: 2174351)\n[PASS] test_rejectedNonzeroRegistryRefundRevertsAllEffects() (gas: 1949325)\n[PASS] test_zeroQuoteStillTriggersWhenDue() (gas: 1643668)\n[PASS] test_zeroValueHasNoStipend() (gas: 1564768)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 399.78ms (1.83s CPU time)\n\nRan 8 tests for test/Artifacts.t.sol:ArtifactsTest\n[PASS] test_constructorDoesNotReadCurator() (gas: 267294)\n[PASS] test_constructorRejectsZeroAddressesAndStoresTheRest() (gas: 5860)\n[PASS] test_deployScriptUsesTheFiveStaticAddresses() (gas: 30455120)\n[PASS] test_mainnetScriptSelectionIsUnchanged() (gas: 30146682)\n[PASS] test_noForbiddenOpcodesInRuntime() (gas: 56161866)\n[PASS] test_noImmutableReferencesInAnyArtifact() (gas: 90238503)\n[PASS] test_sepoliaRehearsalPassesZeroBurnExecutor() (gas: 30295032)\n[PASS] test_twoDeploymentsHaveIdenticalRuntimeCode() (gas: 3367324)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 399.74ms (134.07ms CPU time)\n\nRan 3 tests for test/Attestations.t.sol:AttestationsTest\n[PASS] test_allFiveRecoverTheAttesterUnderTheirOwnDomainOnly() (gas: 4815788)\n[PASS] test_loaderRejectsUnknownAnswerTypeNames() (gas: 4845)\n[PASS] test_protocolVectorDigestAndSelector() (gas: 1937147)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 399.85ms (6.21ms CPU time)\n\nRan 10 tests for test/ReviewChanges.t.sol:ReviewChangesTest\n[PASS] test_fuzz_emptyFixedArgRequiresZeroValueForT1AndT2(uint256) (runs: 256, μ: 3038839, ~: 3038629)\nLogs:\n  Bound result 608\n\n[PASS] test_fuzz_ordinalShowsLowestVerifiedId(uint8) (runs: 256, μ: 4642662, ~: 4846139)\nLogs:\n  Bound result 10\n\n[PASS] test_hugeAnswerClearsUintBoolAndSharedRequestsUnderStipend() (gas: 26378702)\n[PASS] test_hugeSignatureClearsPendingAndAllowsImmediateRetry() (gas: 6837849)\n[PASS] test_metadataReportsMinimaEvenWhenSignedPanelIsLarger() (gas: 6306452)\n[PASS] test_scalarAnswerLengthPrecedesChainSignerAndClaimedType() (gas: 17765774)\n[PASS] test_sharedAnswerUpperBoundPrecedesChainAndSigner() (gas: 4502989)\n[PASS] test_signatureLengthPrecedesAnswerLengthAndChain() (gas: 37651315)\n[PASS] test_unknownRequestStillPrecedesDynamicSizeChecks() (gas: 12871553)\n[PASS] test_validationPrecedenceAfterSizes() (gas: 18084381)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 399.73ms (810.77ms 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    | 3330  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | mintCard          | 3274  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | sponsor           | 3159  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | transfer          | 3354  | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | upgradeAndDeliver | 3267  | 0       | 0        |\n╰----------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8658\n  Bound result 54055890887505\n  Bound result 468554775930373663\n  Bound result 126921480811311579\n  Bound result 161972015042974976\n  Bound result 24498\n  Bound result 661228275080586922\n  Bound result 1999999999999999997\n  Bound result 6188\n  Bound result 1042704468815506875\n  Bound result 15973\n  Bound result 3987\n  Bound result 9636\n  Bound result 20823794640997\n  Bound result 14577\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.44s (5.44s CPU time)\n\nRan 1 test for test/BurnInvariant.t.sol:BurnInvariantTest\n[PASS] invariant_registryRetainsNoClaimETHAndPoolOnlyFundsOracleRequests() (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| BurnHandler | claim    | 16384 | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 144\n  Bound result 7985\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 63767879349193786188\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 6410\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 7766\n  Bound result 4329670727698909\n  Bound result 13205\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 19999999999999680\n  Bound result 3825547069\n  Bound result 5716477868600793\n  Bound result 690265094819\n  Bound result 134\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 2670744397685936\n  Bound result 4333632135824622\n  Bound result 81008941\n  Bound result 10783\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 2929\n  Bound result 4916\n  Bound result 13810\n  Bound result 105729120327107\n  Bound result 11854690883456285\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 6868\n  Bound result 83848913863214599099\n  Bound result 4329670727698909\n  Bound result 1180\n  Bound result 74264337592978034889\n  Bound result 3568\n  Bound result 11629\n  Bound result 20677\n  Bound result 4329670727698909\n  Bound result 3276654719950471\n  Bound result 1510864669\n  Bound result 4329670727698909\n  Bound result 2120307664\n  Bound result 1360\n  Bound result 4329670727698909\n  Bound result 6802\n  Bound result 2261864592\n  Bound result 4329670727698909\n  Bound result 7086\n  Bound result 2716\n  Bound result 4329670727698909\n  Bound result 13899\n  Bound result 117\n  Bound result 2027783368\n  Bound result 4333632135824622\n  Bound result 74264337592978034888\n  Bound result 907667\n  Bound result 5778949\n  Bound result 1181\n  Bound result 19729\n  Bound result 6392190220459756\n  Bound result 5407\n  Bound result 11654\n  Bound result 65534\n  Bound result 12389362833183256600\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 15951928665393855\n  Bound result 1064527637684582\n  Bound result 13155517750162\n  Bound result 4333632135824619\n  Bound result 23422\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 2570353573670959\n  Bound result 194\n  Bound result 74264337592978034889\n  Bound result 7210\n  Bound result 13267727445860684\n  Bound result 74264337592978034889\n  Bound result 3083\n  Bound result 4333632135824622\n  Bound result 41202672070761447015\n  Bound result 2670744397685944\n  Bound result 4333632135824622\n  Bound result 4724\n  Bound result 4329670727698909\n  Bound result 5319837816889016\n  Bound result 6403\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 20917\n  Bound result 64077570176564\n  Bound result 23699\n  Bound result 24982\n  Bound result 22640\n  Bound result 2723662918551565\n  Bound result 12259\n  Bound result 114309904387462576312\n  Bound result 2316788764578898\n  Bound result 913155099959967\n  Bound result 117\n  Bound result 100510664662104\n  Bound result 0\n  Bound result 44817745960678564111\n  Bound result 9416942575412883\n  Bound result 33362410302\n  Bound result 6435297065371102076\n  Bound result 4329670727698909\n  Bound result 2245\n  Bound result 7663\n  Bound result 3268\n  Bound result 4333632135824622\n  Bound result 5407\n  Bound result 494299987433640\n  Bound result 4333632135824622\n  Bound result 7899\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 16119864857006694575\n  Bound result 4277083779149304\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 21515\n  Bound result 10208\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 17432\n  Bound result 4900363718714625\n  Bound result 74264337592978034889\n  Bound result 653\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 12821\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 1651\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 421646472\n  Bound result 884500\n  Bound result 249120603795755\n  Bound result 74264337592978034889\n  Bound result 3159\n  Bound result 4333632135824622\n  Bound result 86417625703261823181\n  Bound result 8024036764206166\n  Bound result 4333632135824622\n  Bound result 2541\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 4333632135824622\n  Bound result 22389\n  Bound result 8523652702637454\n  Bound result 4333632135824622\n  Bound result 3245\n  Bound result 369\n  Bound result 1049257880424015\n  Bound result 15531031804417922\n  Bound result 7853301383474715\n  Bound result 19122736795133800\n  Bound result 74264337592978034889\n  Bound result 4329670727698909\n  Bound result 30070628031448\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.15s (12.14s 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_poolDailyAndLifetimeLimits\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       | 270   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | advanceTime       | 259   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | applyShared       | 263   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | claimSponsored    | 281   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverFalse      | 273   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTampered   | 279   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | deliverTrue       | 262   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | donate            | 246   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | failRequest       | 278   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | mintCard          | 287   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | registerSpec      | 279   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | replayConsumed    | 270   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | requestSharedFact | 294   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | sponsor           | 253   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | transfer          | 262   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradePaid       | 284   | 0       | 0        |\n|-------------+-------------------+-------+---------+----------|\n| FullHandler | upgradeSponsored  | 268   | 0       | 0        |\n╰-------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2099\n  Bound result 12624\n  Bound result 10001\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 252257658467684437\n  Bound result 4\n  Bound result 1\n  Bound result 1\n  Bound result 697827029473048827\n\n[PASS] test_handlerReplayOfAConsumedIdChangesNothing() (gas: 1920489)\n[PASS] test_handlerSponsoredSelectionAcceptsMaxSeed() (gas: 1763915)\nLogs:\n  Bound result 3000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.13s (14.12s CPU time)\n\nRan 18 test suites in 14.13s (35.20s CPU time): 175 tests passed, 0 failed, 17 skipped (192 total tests)\n","passed":true},{"durationMs":241,"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,\"ADAPTATION.md\":138,\"CATALOG.md\":268,\"CONCEPT.md\":251,\"DISCLOSURE.md\":50,\"INTEGRATION.md\":420,\"LICENSE\":21,\"README.md\":399,\"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/burn/BurnExecutorV2.sol.txt\":314,\"reference/burn/abi.json\":1001,\"reference/burn/provenance.json\":17,\"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\":48,\"src/Composer.sol\":629,\"src/HiveData.sol\":75,\"src/Registry.sol\":746,\"src/Renderer.sol\":427,\"src/TemplateData.sol\":16,\"src/Types.sol\":41,\"src/interfaces/IBurnExecutor.sol\":12,\"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/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\":816,\"test/Artifacts.t.sol\":186,\"test/Attestations.t.sol\":196,\"test/Base.t.sol\":158,\"test/BurnInvariant.t.sol\":120,\"test/BurnRule.t.sol\":394,\"test/Goldens.t.sol\":444,\"test/Invariants.t.sol\":124,\"test/InvariantsExtended.t.sol\":520,\"test/Launch.t.sol\":234,\"test/NOTES.md\":398,\"test/ReReview.t.sol\":262,\"test/Registry.t.sol\":776,\"test/RegistryRules.t.sol\":320,\"test/Rename.t.sol\":224,\"test/ReviewChanges.t.sol\":215,\"test/Templates.t.sol\":149,\"test/fixtures/golden_synthetic_collector_preimage.txt\":1,\"test/fixtures/golden_synthetic_collector_svg.txt\":1,\"test/fixtures/golden_synthetic_collector_uri.txt\":1,\"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_fullhouse_preimage.txt\":1,\"test/fixtures/golden_synthetic_fullhouse_svg.txt\":1,\"test/fixtures/golden_synthetic_fullhouse_uri.txt\":1,\"test/fixtures/golden_synthetic_honey_preimage.txt\":1,\"test/fixtures/golden_synthetic_honey_svg.txt\":1,\"test/fixtures/golden_synthetic_honey_uri.txt\":1,\"test/fixtures/golden_synthetic_newcomer_preimage.txt\":1,\"test/fixtures/golden_synthetic_newcomer_svg.txt\":1,\"test/fixtures/golden_synthetic_newcomer_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_outsider_preimage.txt\":1,\"test/fixtures/golden_synthetic_outsider_svg.txt\":1,\"test/fixtures/golden_synthetic_outsider_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/BurnRule.fork.t.sol\":193,\"test/fork/Mainnet.fork.t.sol\":338,\"test/mocks/MockBurnExecutor.sol\":157,\"test/mocks/Mocks.sol\":231,\"tools/gen_template.py\":898,\"tools/test_gen_template.py\":334},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4977,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/Registry.sol:509: Registry._rule(uint16) (src/Registry.sol#509-523) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:494: Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes) (src/Registry.sol#494-506) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:703: Registry._fromPool(uint16) (src/Registry.sol#703-716) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:509: Registry._rule(uint16) (src/Registry.sol#509-523) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:509: Registry._rule(uint16) (src/Registry.sol#509-523) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:406: Registry.abandon(bytes32) (src/Registry.sol#406-413) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:469: Registry.onResult(bytes32,OracleAttestation,bytes) (src/Registry.sol#469-491) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Registry.sol:509: Registry._rule(uint16) (src/Registry.sol#509-523) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/Registry.sol:431: Reentrancy in Registry._request(address,uint16,uint256) (src/Registry.sol#431-453):\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:255: Registry.cardOf(uint256).k (src/Registry.sol#255) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Renderer.sol:407: Renderer.escapeJson(bytes).o (src/Renderer.sol#407) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Registry.sol:644: Registry.applySharedFact(uint16,address[]).found (src/Registry.sol#644) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Composer.sol:615: Composer.hexMin(uint256).n (src/Composer.sol#615) 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:318: Renderer._communityAttributes(Card).name (src/Renderer.sol#318) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Registry.sol:250: Registry.cardOf(uint256).n (src/Registry.sol#250) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Composer.sol:588: Composer.canonical(Composer.Question).defs (src/Composer.sol#588) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Renderer.sol:399: Renderer.escapeJson(bytes).extra (src/Renderer.sol#399) is a local variable never initialized\n[medium/medium] unused-return at src/Registry.sol:698: Registry._requireMember() (src/Registry.sol#698-701) ignores return value by (None,joined) = curator.firstHourOf(msg.sender) (src/Registry.sol#699)\n[medium/medium] unused-return at src/Registry.sol:720: Registry._burnOrRefund() (src/Registry.sol#720-745) ignores return value by (amount,fee) = burnExecutor.previewBridge{gas: PREVIEW_GAS}() (src/Registry.sol#722-739)\n[medium/medium] unused-return at src/Registry.sol:526: Registry._check(Registry.Pending,OracleAttestation,bytes,uint8,uint64,uint64) (src/Registry.sol#526-554) ignores return value by (signer,err,None) = ECDSA.tryRecover(attestationDigest(a),v,r,s) (src/Registry.sol#545)\n[low/medium] calls-loop at src/Registry.sol:357: Registry.specOf(uint16) (src/Registry.sol#357-365) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#364)\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:368: Registry.composeBody(uint16,address) (src/Registry.sol#368-375) has external calls inside a loop: composer.compose(s,claimant,address(this),traitId == 1301,address(curator)) (src/Registry.sol#374)\n[low/medium] calls-loop at src/Registry.sol:357: Registry.specOf(uint16) (src/Registry.sol#357-365) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#364)\n[low/medium] calls-loop at src/Registry.sol:357: Registry.specOf(uint16) (src/Registry.sol#357-365) has external calls inside a loop: composer.catalogSpec(traitId,address(curator)) (src/Registry.sol#364)\n[low/medium] calls-loop at src/Registry.sol:431: Registry._request(address,uint16,uint256) (src/Registry.sol#431-453) 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#441-448)\n[low/medium] reentrancy-benign at src/Registry.sol:431: Reentrancy in Registry._request(address,uint16,uint256) (src/Registry.sol#431-453):\n[low/medium] timestamp at src/Registry.sol:526: Registry._check(Registry.Pending,OracleAttestation,bytes,uint8,uint64,uint64) (src/Registry.sol#526-554) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:509: Registry._rule(uint16) (src/Registry.sol#509-523) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:494: Registry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes) (src/Registry.sol#494-506) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:456: Registry._clear(bytes32,Registry.Pending) (src/Registry.sol#456-463) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:469: Registry.onResult(bytes32,OracleAttestation,bytes) (src/Registry.sol#469-491) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:581: Registry._mark(address,uint16,bytes32,bytes32) (src/Registry.sol#581-587) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:703: Registry._fromPool(uint16) (src/Registry.sol#703-716) uses timestamp for comparisons\n[low/medium] timestamp at src/Registry.sol:406: Registry.abandon(bytes32) (src/Registry.sol#406-413) uses timestamp for comparisons","passed":true},{"durationMs":1064,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/Renderer.sol:62: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/Registry.sol:618: Reentrancy: State change after external call (2 places)\n[low] costly-loop at src/Registry.sol:390: Costly operations inside loop\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 (4 places)\n[low] literal-instead-of-constant at src/Composer.sol:76: Literal Instead of Constant (248 places)\n[low] require-revert-in-loop at src/Composer.sol:244: Loop Contains `require`/`revert` (7 places)\n[low] state-no-address-check at src/Registry.sol:203: Address State Variable Set Without Checks\n[low] state-variable-could-be-immutable at src/Registry.sol:94: State Variable Could Be Immutable (9 places)\n[low] unchecked-return at src/Registry.sol:401: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/Composer.sol:615: Uninitialized Local Variable (5 places)\n[low] unsafe-oz-erc721-mint at src/Registry.sol:218: Unsafe `ERC721::_mint()`\n[low] unused-public-function at src/Composer.sol:307: Public Function Not Used Internally (4 places)\n[low] unused-state-variable at src/Registry.sol:65: Unused State Variable (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c59ac8820250c27e2bacd57ae34616015e961457c2e7539a48d58d32d66ca416","verifiedTreeHash":"82adfa26545d81cce2db2559c50d435710beb0fe","verifierVersion":"0.1.0+d952fceb"}]}