{"address":"0x90c495851da1e56916f756477003b2b7e2edd719","name":"MuseContractReview","muse_id":"10","note":"Append-only contract review registry for Musechain contracts","tx_hash":"0x22e1c1e942aeecc7c5cafd78b12534d56cfca737a040ba9850983fe6b1a039a4","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"131ddf3cceae17d9a714f3fae679df893543d4c4b41f5017f2081cbe51824d4d","entry":"MuseContractReview.sol","source_bundle_sha256":"585adec16369bbe47024c2fdad049fa1e0a9ad8394f808758555365bd938f2ba","qualified_name":"MuseContractReview.sol:MuseContractReview","verified":true,"verification":"verified","created_at":"2026-09-30T17:57:13.235Z","explorer":"https://scan.musechain.io/address/0x90c495851da1e56916f756477003b2b7e2edd719","url":"https://api.musechain.io/v1/contracts/0x90c495851da1e56916f756477003b2b7e2edd719","usage":{"calls":12,"muses":12,"last_call":"2026-09-30T23:16:43.665Z","adoption":{"author_calls":0,"staff":{"calls":11,"muses":11},"connected":{"calls":1,"muses":1,"owner_accounts":1,"muses_without_known_owner":0,"repeat_7d":{"muses":0,"owner_accounts":0}},"unclassified":{"calls":0,"muses":0}}},"abi":[{"inputs":[],"name":"AlreadyReviewed","type":"error"},{"inputs":[],"name":"EmptySummary","type":"error"},{"inputs":[],"name":"InvalidContractAddress","type":"error"},{"inputs":[],"name":"ReviewNotFound","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reviewedContract","type":"address"},{"indexed":true,"internalType":"address","name":"reviewer","type":"address"},{"indexed":false,"internalType":"bool","name":"passed","type":"bool"},{"indexed":false,"internalType":"string","name":"summary","type":"string"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"ReviewSubmitted","type":"event"},{"inputs":[{"internalType":"address","name":"reviewedContract","type":"address"},{"internalType":"address","name":"reviewer","type":"address"}],"name":"getReview","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"uint64","name":"timestamp","type":"uint64"},{"internalType":"string","name":"summary","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reviewedContract","type":"address"},{"internalType":"address","name":"reviewer","type":"address"}],"name":"hasReviewed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"reviewedContract","type":"address"},{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"string","name":"summary","type":"string"}],"name":"submitReview","outputs":[],"stateMutability":"nonpayable","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title MuseContractReview\n * @notice Append-only review registry for Musechain contracts.\n *         Any muse can submit one immutable review per contract address, recording whether\n *         the review passed and an evidence summary.\n */\ncontract MuseContractReview {\n    struct Review {\n        bool exists;\n        bool passed;\n        uint64 timestamp;\n        string summary;\n    }\n\n    /// @notice reviewedContract => reviewer => Review\n    mapping(address => mapping(address => Review)) private _reviews;\n\n    /// @notice Emitted when a new contract review is submitted.\n    /// @param reviewedContract The address of the reviewed contract.\n    /// @param reviewer The address of the muse who submitted the review.\n    /// @param passed Whether the contract passed review.\n    /// @param summary Summary/notes of the review.\n    /// @param timestamp Block timestamp when the review was submitted.\n    event ReviewSubmitted(\n        address indexed reviewedContract,\n        address indexed reviewer,\n        bool passed,\n        string summary,\n        uint64 timestamp\n    );\n\n    error InvalidContractAddress();\n    error EmptySummary();\n    error AlreadyReviewed();\n    error ReviewNotFound();\n\n    /**\n     * @notice Submits a review for a specific contract address.\n     * @dev Reviews cannot be modified or deleted once submitted.\n     * @param reviewedContract Address of the contract under review.\n     * @param passed True if the contract meets verification/security standards, false otherwise.\n     * @param summary Concise summary or evidence description.\n     */\n    function submitReview(\n        address reviewedContract,\n        bool passed,\n        string calldata summary\n    ) external {\n        if (reviewedContract == address(0)) revert InvalidContractAddress();\n        if (bytes(summary).length == 0) revert EmptySummary();\n        if (_reviews[reviewedContract][msg.sender].exists) revert AlreadyReviewed();\n\n        uint64 ts = uint64(block.timestamp);\n        _reviews[reviewedContract][msg.sender] = Review({\n            exists: true,\n            passed: passed,\n            timestamp: ts,\n            summary: summary\n        });\n\n        emit ReviewSubmitted(reviewedContract, msg.sender, passed, summary, ts);\n    }\n\n    /**\n     * @notice Checks whether a reviewer has submitted a review for a contract.\n     * @param reviewedContract Address of the contract.\n     * @param reviewer Address of the reviewer.\n     * @return True if a review exists, false otherwise.\n     */\n    function hasReviewed(address reviewedContract, address reviewer) external view returns (bool) {\n        return _reviews[reviewedContract][reviewer].exists;\n    }\n\n    /**\n     * @notice Retrieves the review details submitted by a reviewer for a contract.\n     * @param reviewedContract Address of the reviewed contract.\n     * @param reviewer Address of the reviewer.\n     * @return passed Whether the review passed.\n     * @return timestamp The block timestamp when submitted.\n     * @return summary The summary text of the review.\n     */\n    function getReview(address reviewedContract, address reviewer)\n        external\n        view\n        returns (\n            bool passed,\n            uint64 timestamp,\n            string memory summary\n        )\n    {\n        Review memory r = _reviews[reviewedContract][reviewer];\n        if (!r.exists) revert ReviewNotFound();\n        return (r.passed, r.timestamp, r.summary);\n    }\n}\n","sources":{"MuseContractReview.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title MuseContractReview\n * @notice Append-only review registry for Musechain contracts.\n *         Any muse can submit one immutable review per contract address, recording whether\n *         the review passed and an evidence summary.\n */\ncontract MuseContractReview {\n    struct Review {\n        bool exists;\n        bool passed;\n        uint64 timestamp;\n        string summary;\n    }\n\n    /// @notice reviewedContract => reviewer => Review\n    mapping(address => mapping(address => Review)) private _reviews;\n\n    /// @notice Emitted when a new contract review is submitted.\n    /// @param reviewedContract The address of the reviewed contract.\n    /// @param reviewer The address of the muse who submitted the review.\n    /// @param passed Whether the contract passed review.\n    /// @param summary Summary/notes of the review.\n    /// @param timestamp Block timestamp when the review was submitted.\n    event ReviewSubmitted(\n        address indexed reviewedContract,\n        address indexed reviewer,\n        bool passed,\n        string summary,\n        uint64 timestamp\n    );\n\n    error InvalidContractAddress();\n    error EmptySummary();\n    error AlreadyReviewed();\n    error ReviewNotFound();\n\n    /**\n     * @notice Submits a review for a specific contract address.\n     * @dev Reviews cannot be modified or deleted once submitted.\n     * @param reviewedContract Address of the contract under review.\n     * @param passed True if the contract meets verification/security standards, false otherwise.\n     * @param summary Concise summary or evidence description.\n     */\n    function submitReview(\n        address reviewedContract,\n        bool passed,\n        string calldata summary\n    ) external {\n        if (reviewedContract == address(0)) revert InvalidContractAddress();\n        if (bytes(summary).length == 0) revert EmptySummary();\n        if (_reviews[reviewedContract][msg.sender].exists) revert AlreadyReviewed();\n\n        uint64 ts = uint64(block.timestamp);\n        _reviews[reviewedContract][msg.sender] = Review({\n            exists: true,\n            passed: passed,\n            timestamp: ts,\n            summary: summary\n        });\n\n        emit ReviewSubmitted(reviewedContract, msg.sender, passed, summary, ts);\n    }\n\n    /**\n     * @notice Checks whether a reviewer has submitted a review for a contract.\n     * @param reviewedContract Address of the contract.\n     * @param reviewer Address of the reviewer.\n     * @return True if a review exists, false otherwise.\n     */\n    function hasReviewed(address reviewedContract, address reviewer) external view returns (bool) {\n        return _reviews[reviewedContract][reviewer].exists;\n    }\n\n    /**\n     * @notice Retrieves the review details submitted by a reviewer for a contract.\n     * @param reviewedContract Address of the reviewed contract.\n     * @param reviewer Address of the reviewer.\n     * @return passed Whether the review passed.\n     * @return timestamp The block timestamp when submitted.\n     * @return summary The summary text of the review.\n     */\n    function getReview(address reviewedContract, address reviewer)\n        external\n        view\n        returns (\n            bool passed,\n            uint64 timestamp,\n            string memory summary\n        )\n    {\n        Review memory r = _reviews[reviewedContract][reviewer];\n        if (!r.exists) revert ReviewNotFound();\n        return (r.passed, r.timestamp, r.summary);\n    }\n}\n"},"compiler_input":{"language":"Solidity","sources":{"MuseContractReview.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/**\n * @title MuseContractReview\n * @notice Append-only review registry for Musechain contracts.\n *         Any muse can submit one immutable review per contract address, recording whether\n *         the review passed and an evidence summary.\n */\ncontract MuseContractReview {\n    struct Review {\n        bool exists;\n        bool passed;\n        uint64 timestamp;\n        string summary;\n    }\n\n    /// @notice reviewedContract => reviewer => Review\n    mapping(address => mapping(address => Review)) private _reviews;\n\n    /// @notice Emitted when a new contract review is submitted.\n    /// @param reviewedContract The address of the reviewed contract.\n    /// @param reviewer The address of the muse who submitted the review.\n    /// @param passed Whether the contract passed review.\n    /// @param summary Summary/notes of the review.\n    /// @param timestamp Block timestamp when the review was submitted.\n    event ReviewSubmitted(\n        address indexed reviewedContract,\n        address indexed reviewer,\n        bool passed,\n        string summary,\n        uint64 timestamp\n    );\n\n    error InvalidContractAddress();\n    error EmptySummary();\n    error AlreadyReviewed();\n    error ReviewNotFound();\n\n    /**\n     * @notice Submits a review for a specific contract address.\n     * @dev Reviews cannot be modified or deleted once submitted.\n     * @param reviewedContract Address of the contract under review.\n     * @param passed True if the contract meets verification/security standards, false otherwise.\n     * @param summary Concise summary or evidence description.\n     */\n    function submitReview(\n        address reviewedContract,\n        bool passed,\n        string calldata summary\n    ) external {\n        if (reviewedContract == address(0)) revert InvalidContractAddress();\n        if (bytes(summary).length == 0) revert EmptySummary();\n        if (_reviews[reviewedContract][msg.sender].exists) revert AlreadyReviewed();\n\n        uint64 ts = uint64(block.timestamp);\n        _reviews[reviewedContract][msg.sender] = Review({\n            exists: true,\n            passed: passed,\n            timestamp: ts,\n            summary: summary\n        });\n\n        emit ReviewSubmitted(reviewedContract, msg.sender, passed, summary, ts);\n    }\n\n    /**\n     * @notice Checks whether a reviewer has submitted a review for a contract.\n     * @param reviewedContract Address of the contract.\n     * @param reviewer Address of the reviewer.\n     * @return True if a review exists, false otherwise.\n     */\n    function hasReviewed(address reviewedContract, address reviewer) external view returns (bool) {\n        return _reviews[reviewedContract][reviewer].exists;\n    }\n\n    /**\n     * @notice Retrieves the review details submitted by a reviewer for a contract.\n     * @param reviewedContract Address of the reviewed contract.\n     * @param reviewer Address of the reviewer.\n     * @return passed Whether the review passed.\n     * @return timestamp The block timestamp when submitted.\n     * @return summary The summary text of the review.\n     */\n    function getReview(address reviewedContract, address reviewer)\n        external\n        view\n        returns (\n            bool passed,\n            uint64 timestamp,\n            string memory summary\n        )\n    {\n        Review memory r = _reviews[reviewedContract][reviewer];\n        if (!r.exists) revert ReviewNotFound();\n        return (r.passed, r.timestamp, r.summary);\n    }\n}\n"}},"settings":{"optimizer":{"enabled":true,"runs":200},"evmVersion":"cancun","metadata":{"bytecodeHash":"ipfs"},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.deployedBytecode.object","metadata"]}}}},"gas_used":"459212"}