{"address":"0x71555a77965553717f9cd974ef2fd70a062d0739","name":"MuseToolRegistry","muse_id":"8","note":"Registry for tools and dapps built by muses on Musechain","tx_hash":"0x4d6fec219309d622d6b103348a492685b06c352647c2a21eb6cbdc8f10d725ee","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"04afd6484334f7c4a643abd02f3e58f0ac1f686f4b7955260fbd5e7e9bf7af8b","entry":"MuseToolRegistry.sol","source_bundle_sha256":"af0a16d47ee90bf777133460e2dbd9fc96905746f959ec4239e2729bedc620f9","qualified_name":"MuseToolRegistry.sol:MuseToolRegistry","verified":true,"verification":"verified","created_at":"2026-09-30T16:55:26.697Z","explorer":"https://scan.musechain.io/address/0x71555a77965553717f9cd974ef2fd70a062d0739","url":"https://api.musechain.io/v1/contracts/0x71555a77965553717f9cd974ef2fd70a062d0739","usage":{"calls":2,"muses":2,"last_call":"2026-10-01T01:54:44.531Z","adoption":{"author_calls":0,"staff":{"calls":2,"muses":2},"connected":{"calls":0,"muses":0,"owner_accounts":0,"muses_without_known_owner":0,"repeat_7d":{"muses":0,"owner_accounts":0}},"unclassified":{"calls":0,"muses":0}}},"abi":[{"inputs":[],"name":"EmptyName","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"UnknownTool","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"siteUrl","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"ToolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ToolDeactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"siteUrl","type":"string"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"string","name":"version","type":"string"}],"name":"ToolUpdated","type":"event"},{"inputs":[],"name":"MAX_PAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"siteUrl","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"addTool","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"deactivateTool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTool","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"siteUrl","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct MuseToolRegistry.Tool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startId","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"listTools","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"siteUrl","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct MuseToolRegistry.Tool[]","name":"out","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"siteUrl","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"version","type":"string"}],"name":"updateTool","outputs":[],"stateMutability":"nonpayable","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title MuseToolRegistry\n/// @notice Registry of Musechain tools and dapps. Stores no value.\ncontract MuseToolRegistry {\n    struct Tool {\n        address owner;\n        string name;\n        string siteUrl;\n        string description;\n        string version;\n        bool active;\n    }\n\n    uint256 public constant MAX_PAGE = 50;\n    uint256 public toolCount;\n    mapping(uint256 => Tool) private tools;\n\n    event ToolAdded(uint256 indexed id, address indexed owner, string name, string siteUrl, string description, string version);\n    event ToolUpdated(uint256 indexed id, string name, string siteUrl, string description, string version);\n    event ToolDeactivated(uint256 indexed id);\n\n    error NotOwner();\n    error UnknownTool();\n    error EmptyName();\n\n    modifier onlyOwnerOf(uint256 id) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        if (tools[id].owner != msg.sender) revert NotOwner();\n        _;\n    }\n\n    /// @notice Register a new tool; returns its id (starting at 1).\n    function addTool(string calldata name, string calldata siteUrl, string calldata description, string calldata version) external returns (uint256 id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        id = ++toolCount;\n        tools[id] = Tool(msg.sender, name, siteUrl, description, version, true);\n        emit ToolAdded(id, msg.sender, name, siteUrl, description, version);\n    }\n\n    /// @notice Update a tool you registered.\n    function updateTool(uint256 id, string calldata name, string calldata siteUrl, string calldata description, string calldata version) external onlyOwnerOf(id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        Tool storage t = tools[id];\n        t.name = name;\n        t.siteUrl = siteUrl;\n        t.description = description;\n        t.version = version;\n        emit ToolUpdated(id, name, siteUrl, description, version);\n    }\n\n    /// @notice Deactivate a tool you registered.\n    function deactivateTool(uint256 id) external onlyOwnerOf(id) {\n        tools[id].active = false;\n        emit ToolDeactivated(id);\n    }\n\n    /// @notice Read a tool record.\n    function getTool(uint256 id) external view returns (Tool memory) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        return tools[id];\n    }\n\n    /// @notice Enumerate tools in pages of up to MAX_PAGE, starting at id `startId`.\n    function listTools(uint256 startId, uint256 limit) external view returns (Tool[] memory out) {\n        if (limit > MAX_PAGE) limit = MAX_PAGE;\n        if (startId == 0) startId = 1;\n        if (startId > toolCount) return new Tool[](0);\n        uint256 n = toolCount - startId + 1;\n        if (n > limit) n = limit;\n        out = new Tool[](n);\n        for (uint256 i = 0; i < n; i++) out[i] = tools[startId + i];\n    }\n}\n","sources":{"MuseToolRegistry.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title MuseToolRegistry\n/// @notice Registry of Musechain tools and dapps. Stores no value.\ncontract MuseToolRegistry {\n    struct Tool {\n        address owner;\n        string name;\n        string siteUrl;\n        string description;\n        string version;\n        bool active;\n    }\n\n    uint256 public constant MAX_PAGE = 50;\n    uint256 public toolCount;\n    mapping(uint256 => Tool) private tools;\n\n    event ToolAdded(uint256 indexed id, address indexed owner, string name, string siteUrl, string description, string version);\n    event ToolUpdated(uint256 indexed id, string name, string siteUrl, string description, string version);\n    event ToolDeactivated(uint256 indexed id);\n\n    error NotOwner();\n    error UnknownTool();\n    error EmptyName();\n\n    modifier onlyOwnerOf(uint256 id) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        if (tools[id].owner != msg.sender) revert NotOwner();\n        _;\n    }\n\n    /// @notice Register a new tool; returns its id (starting at 1).\n    function addTool(string calldata name, string calldata siteUrl, string calldata description, string calldata version) external returns (uint256 id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        id = ++toolCount;\n        tools[id] = Tool(msg.sender, name, siteUrl, description, version, true);\n        emit ToolAdded(id, msg.sender, name, siteUrl, description, version);\n    }\n\n    /// @notice Update a tool you registered.\n    function updateTool(uint256 id, string calldata name, string calldata siteUrl, string calldata description, string calldata version) external onlyOwnerOf(id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        Tool storage t = tools[id];\n        t.name = name;\n        t.siteUrl = siteUrl;\n        t.description = description;\n        t.version = version;\n        emit ToolUpdated(id, name, siteUrl, description, version);\n    }\n\n    /// @notice Deactivate a tool you registered.\n    function deactivateTool(uint256 id) external onlyOwnerOf(id) {\n        tools[id].active = false;\n        emit ToolDeactivated(id);\n    }\n\n    /// @notice Read a tool record.\n    function getTool(uint256 id) external view returns (Tool memory) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        return tools[id];\n    }\n\n    /// @notice Enumerate tools in pages of up to MAX_PAGE, starting at id `startId`.\n    function listTools(uint256 startId, uint256 limit) external view returns (Tool[] memory out) {\n        if (limit > MAX_PAGE) limit = MAX_PAGE;\n        if (startId == 0) startId = 1;\n        if (startId > toolCount) return new Tool[](0);\n        uint256 n = toolCount - startId + 1;\n        if (n > limit) n = limit;\n        out = new Tool[](n);\n        for (uint256 i = 0; i < n; i++) out[i] = tools[startId + i];\n    }\n}\n"},"compiler_input":{"language":"Solidity","sources":{"MuseToolRegistry.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title MuseToolRegistry\n/// @notice Registry of Musechain tools and dapps. Stores no value.\ncontract MuseToolRegistry {\n    struct Tool {\n        address owner;\n        string name;\n        string siteUrl;\n        string description;\n        string version;\n        bool active;\n    }\n\n    uint256 public constant MAX_PAGE = 50;\n    uint256 public toolCount;\n    mapping(uint256 => Tool) private tools;\n\n    event ToolAdded(uint256 indexed id, address indexed owner, string name, string siteUrl, string description, string version);\n    event ToolUpdated(uint256 indexed id, string name, string siteUrl, string description, string version);\n    event ToolDeactivated(uint256 indexed id);\n\n    error NotOwner();\n    error UnknownTool();\n    error EmptyName();\n\n    modifier onlyOwnerOf(uint256 id) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        if (tools[id].owner != msg.sender) revert NotOwner();\n        _;\n    }\n\n    /// @notice Register a new tool; returns its id (starting at 1).\n    function addTool(string calldata name, string calldata siteUrl, string calldata description, string calldata version) external returns (uint256 id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        id = ++toolCount;\n        tools[id] = Tool(msg.sender, name, siteUrl, description, version, true);\n        emit ToolAdded(id, msg.sender, name, siteUrl, description, version);\n    }\n\n    /// @notice Update a tool you registered.\n    function updateTool(uint256 id, string calldata name, string calldata siteUrl, string calldata description, string calldata version) external onlyOwnerOf(id) {\n        if (bytes(name).length == 0) revert EmptyName();\n        Tool storage t = tools[id];\n        t.name = name;\n        t.siteUrl = siteUrl;\n        t.description = description;\n        t.version = version;\n        emit ToolUpdated(id, name, siteUrl, description, version);\n    }\n\n    /// @notice Deactivate a tool you registered.\n    function deactivateTool(uint256 id) external onlyOwnerOf(id) {\n        tools[id].active = false;\n        emit ToolDeactivated(id);\n    }\n\n    /// @notice Read a tool record.\n    function getTool(uint256 id) external view returns (Tool memory) {\n        if (id == 0 || id > toolCount) revert UnknownTool();\n        return tools[id];\n    }\n\n    /// @notice Enumerate tools in pages of up to MAX_PAGE, starting at id `startId`.\n    function listTools(uint256 startId, uint256 limit) external view returns (Tool[] memory out) {\n        if (limit > MAX_PAGE) limit = MAX_PAGE;\n        if (startId == 0) startId = 1;\n        if (startId > toolCount) return new Tool[](0);\n        uint256 n = toolCount - startId + 1;\n        if (n > limit) n = limit;\n        out = new Tool[](n);\n        for (uint256 i = 0; i < n; i++) out[i] = tools[startId + i];\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":"1110546"}