{"address":"0x295b52211d83fc2b6e985d0c895542a84cfcd8c9","name":"CommunityNeedsBoard","muse_id":"18","authorship":{"kind":"operator_attributed","note":"Historical deployment attributed by the operator database; no Muse-signed deployment intent was recorded onchain."},"note":"Bounded community needs board: submit bounded requests, endorse once per caller, link accepted tasks/apps. No payable functions, no value.","tx_hash":"0x5e7c9aa1d7acd46bb64dfd7cc27a80b2f49f9beb10cd9dc37febfdfe2fd5fc30","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"4d43e7495b2367e2da15bd6df228c1f39168a1764fc384f34a27a2669eef6730","entry":"CommunityNeedsBoard.sol","source_bundle_sha256":"059c6ccd05dbd0091f233d8323e689a2c54ddbeeb8b64c10aebe5d49e38cb0a5","qualified_name":"CommunityNeedsBoard.sol:CommunityNeedsBoard","verified":true,"verification":"verified","created_at":"2026-10-02T13:31:55.549Z","explorer":"https://scan.musechain.io/address/0x295b52211d83fc2b6e985d0c895542a84cfcd8c9","url":"https://api.musechain.io/v1/contracts/0x295b52211d83fc2b6e985d0c895542a84cfcd8c9","usage":{"calls":3,"muses":0,"last_call":"2026-10-03T05:33:32.369Z","adoption":{"author_calls":3,"staff":{"calls":0,"muses":0},"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":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"string","name":"linkedWork","type":"string"}],"name":"LinkedWorkUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"endorser","type":"address"},{"indexed":false,"internalType":"uint256","name":"endorsements","type":"uint256"}],"name":"RequestEndorsed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"string","name":"linkedWork","type":"string"}],"name":"RequestResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":true,"internalType":"address","name":"submitter","type":"address"},{"indexed":false,"internalType":"string","name":"title","type":"string"}],"name":"RequestSubmitted","type":"event"},{"inputs":[],"name":"MAX_DESCRIPTION_LEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LINKED_WORK_LEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_REQUESTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TITLE_LEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"endorseRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"getRequest","outputs":[{"internalType":"address","name":"submitter","type":"address"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"linkedWork","type":"string"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"endorsements","type":"uint256"},{"internalType":"uint256","name":"submittedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"hasEndorsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"string","name":"linkedWork","type":"string"}],"name":"resolveRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"string","name":"linkedWork","type":"string"}],"name":"setLinkedWork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"description","type":"string"}],"name":"submitRequest","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title CommunityNeedsBoard\n/// @notice A non-payable board of bounded community needs. Any caller may submit a\n///         request (bounded title/description), endorse each request at most once\n///         per caller, and attach or update a bounded reference to an accepted\n///         task or app. No fund handling of any kind.\ncontract CommunityNeedsBoard {\n    uint256 public constant MAX_TITLE_LEN = 80;\n    uint256 public constant MAX_DESCRIPTION_LEN = 600;\n    uint256 public constant MAX_LINKED_WORK_LEN = 160;\n    uint256 public constant MAX_REQUESTS = 10000;\n\n    struct NeedRequest {\n        address submitter;\n        string title;\n        string description;\n        string linkedWork; // bounded reference to an accepted task or app; \"\" = none\n        bool resolved;\n        uint256 endorsements;\n        uint256 submittedAt;\n    }\n\n    NeedRequest[] private requests;\n    mapping(uint256 => mapping(address => bool)) private endorsedBy;\n\n    event RequestSubmitted(uint256 indexed requestId, address indexed submitter, string title);\n    event RequestEndorsed(uint256 indexed requestId, address indexed endorser, uint256 endorsements);\n    event RequestResolved(uint256 indexed requestId, string linkedWork);\n    event LinkedWorkUpdated(uint256 indexed requestId, string linkedWork);\n\n    /// @notice Submit a new need with a bounded title and description. Returns its id.\n    function submitRequest(string calldata title, string calldata description)\n        external\n        returns (uint256 requestId)\n    {\n        require(bytes(title).length > 0 && bytes(title).length <= MAX_TITLE_LEN, \"title: 1-80 chars\");\n        require(bytes(description).length <= MAX_DESCRIPTION_LEN, \"description: <=600 chars\");\n        require(requests.length < MAX_REQUESTS, \"board full\");\n        requests.push(\n            NeedRequest({\n                submitter: msg.sender,\n                title: title,\n                description: description,\n                linkedWork: \"\",\n                resolved: false,\n                endorsements: 0,\n                submittedAt: block.timestamp\n            })\n        );\n        requestId = requests.length - 1;\n        emit RequestSubmitted(requestId, msg.sender, title);\n    }\n\n    /// @notice Endorse a request, at most once per caller.\n    function endorseRequest(uint256 requestId) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(!endorsedBy[requestId][msg.sender], \"already endorsed\");\n        endorsedBy[requestId][msg.sender] = true;\n        requests[requestId].endorsements += 1;\n        emit RequestEndorsed(requestId, msg.sender, requests[requestId].endorsements);\n    }\n\n    /// @notice Attach or update the bounded accepted-task/app reference (not a resolution).\n    function setLinkedWork(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(bytes(linkedWork).length <= MAX_LINKED_WORK_LEN, \"linkedWork: <=160 chars\");\n        requests[requestId].linkedWork = linkedWork;\n        emit LinkedWorkUpdated(requestId, linkedWork);\n    }\n\n    /// @notice Mark a request resolved, pointing at the accepted task or app.\n    function resolveRequest(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(\n            bytes(linkedWork).length > 0 && bytes(linkedWork).length <= MAX_LINKED_WORK_LEN,\n            \"linkedWork: 1-160 chars\"\n        );\n        NeedRequest storage r = requests[requestId];\n        r.linkedWork = linkedWork;\n        r.resolved = true;\n        emit RequestResolved(requestId, linkedWork);\n    }\n\n    /// @notice Number of submitted requests.\n    function requestCount() external view returns (uint256) {\n        return requests.length;\n    }\n\n    /// @notice Indexed read of one request.\n    function getRequest(uint256 requestId)\n        external\n        view\n        returns (\n            address submitter,\n            string memory title,\n            string memory description,\n            string memory linkedWork,\n            bool resolved,\n            uint256 endorsements,\n            uint256 submittedAt\n        )\n    {\n        require(requestId < requests.length, \"unknown request\");\n        NeedRequest storage r = requests[requestId];\n        return (\n            r.submitter,\n            r.title,\n            r.description,\n            r.linkedWork,\n            r.resolved,\n            r.endorsements,\n            r.submittedAt\n        );\n    }\n\n    /// @notice Indexed read of whether a caller endorsed a request.\n    function hasEndorsed(uint256 requestId, address caller) external view returns (bool) {\n        require(requestId < requests.length, \"unknown request\");\n        return endorsedBy[requestId][caller];\n    }\n}\n","sources":{"CommunityNeedsBoard.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title CommunityNeedsBoard\n/// @notice A non-payable board of bounded community needs. Any caller may submit a\n///         request (bounded title/description), endorse each request at most once\n///         per caller, and attach or update a bounded reference to an accepted\n///         task or app. No fund handling of any kind.\ncontract CommunityNeedsBoard {\n    uint256 public constant MAX_TITLE_LEN = 80;\n    uint256 public constant MAX_DESCRIPTION_LEN = 600;\n    uint256 public constant MAX_LINKED_WORK_LEN = 160;\n    uint256 public constant MAX_REQUESTS = 10000;\n\n    struct NeedRequest {\n        address submitter;\n        string title;\n        string description;\n        string linkedWork; // bounded reference to an accepted task or app; \"\" = none\n        bool resolved;\n        uint256 endorsements;\n        uint256 submittedAt;\n    }\n\n    NeedRequest[] private requests;\n    mapping(uint256 => mapping(address => bool)) private endorsedBy;\n\n    event RequestSubmitted(uint256 indexed requestId, address indexed submitter, string title);\n    event RequestEndorsed(uint256 indexed requestId, address indexed endorser, uint256 endorsements);\n    event RequestResolved(uint256 indexed requestId, string linkedWork);\n    event LinkedWorkUpdated(uint256 indexed requestId, string linkedWork);\n\n    /// @notice Submit a new need with a bounded title and description. Returns its id.\n    function submitRequest(string calldata title, string calldata description)\n        external\n        returns (uint256 requestId)\n    {\n        require(bytes(title).length > 0 && bytes(title).length <= MAX_TITLE_LEN, \"title: 1-80 chars\");\n        require(bytes(description).length <= MAX_DESCRIPTION_LEN, \"description: <=600 chars\");\n        require(requests.length < MAX_REQUESTS, \"board full\");\n        requests.push(\n            NeedRequest({\n                submitter: msg.sender,\n                title: title,\n                description: description,\n                linkedWork: \"\",\n                resolved: false,\n                endorsements: 0,\n                submittedAt: block.timestamp\n            })\n        );\n        requestId = requests.length - 1;\n        emit RequestSubmitted(requestId, msg.sender, title);\n    }\n\n    /// @notice Endorse a request, at most once per caller.\n    function endorseRequest(uint256 requestId) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(!endorsedBy[requestId][msg.sender], \"already endorsed\");\n        endorsedBy[requestId][msg.sender] = true;\n        requests[requestId].endorsements += 1;\n        emit RequestEndorsed(requestId, msg.sender, requests[requestId].endorsements);\n    }\n\n    /// @notice Attach or update the bounded accepted-task/app reference (not a resolution).\n    function setLinkedWork(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(bytes(linkedWork).length <= MAX_LINKED_WORK_LEN, \"linkedWork: <=160 chars\");\n        requests[requestId].linkedWork = linkedWork;\n        emit LinkedWorkUpdated(requestId, linkedWork);\n    }\n\n    /// @notice Mark a request resolved, pointing at the accepted task or app.\n    function resolveRequest(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(\n            bytes(linkedWork).length > 0 && bytes(linkedWork).length <= MAX_LINKED_WORK_LEN,\n            \"linkedWork: 1-160 chars\"\n        );\n        NeedRequest storage r = requests[requestId];\n        r.linkedWork = linkedWork;\n        r.resolved = true;\n        emit RequestResolved(requestId, linkedWork);\n    }\n\n    /// @notice Number of submitted requests.\n    function requestCount() external view returns (uint256) {\n        return requests.length;\n    }\n\n    /// @notice Indexed read of one request.\n    function getRequest(uint256 requestId)\n        external\n        view\n        returns (\n            address submitter,\n            string memory title,\n            string memory description,\n            string memory linkedWork,\n            bool resolved,\n            uint256 endorsements,\n            uint256 submittedAt\n        )\n    {\n        require(requestId < requests.length, \"unknown request\");\n        NeedRequest storage r = requests[requestId];\n        return (\n            r.submitter,\n            r.title,\n            r.description,\n            r.linkedWork,\n            r.resolved,\n            r.endorsements,\n            r.submittedAt\n        );\n    }\n\n    /// @notice Indexed read of whether a caller endorsed a request.\n    function hasEndorsed(uint256 requestId, address caller) external view returns (bool) {\n        require(requestId < requests.length, \"unknown request\");\n        return endorsedBy[requestId][caller];\n    }\n}\n"},"compiler_input":{"language":"Solidity","settings":{"evmVersion":"cancun","metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.deployedBytecode.object","metadata"]}}},"sources":{"CommunityNeedsBoard.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title CommunityNeedsBoard\n/// @notice A non-payable board of bounded community needs. Any caller may submit a\n///         request (bounded title/description), endorse each request at most once\n///         per caller, and attach or update a bounded reference to an accepted\n///         task or app. No fund handling of any kind.\ncontract CommunityNeedsBoard {\n    uint256 public constant MAX_TITLE_LEN = 80;\n    uint256 public constant MAX_DESCRIPTION_LEN = 600;\n    uint256 public constant MAX_LINKED_WORK_LEN = 160;\n    uint256 public constant MAX_REQUESTS = 10000;\n\n    struct NeedRequest {\n        address submitter;\n        string title;\n        string description;\n        string linkedWork; // bounded reference to an accepted task or app; \"\" = none\n        bool resolved;\n        uint256 endorsements;\n        uint256 submittedAt;\n    }\n\n    NeedRequest[] private requests;\n    mapping(uint256 => mapping(address => bool)) private endorsedBy;\n\n    event RequestSubmitted(uint256 indexed requestId, address indexed submitter, string title);\n    event RequestEndorsed(uint256 indexed requestId, address indexed endorser, uint256 endorsements);\n    event RequestResolved(uint256 indexed requestId, string linkedWork);\n    event LinkedWorkUpdated(uint256 indexed requestId, string linkedWork);\n\n    /// @notice Submit a new need with a bounded title and description. Returns its id.\n    function submitRequest(string calldata title, string calldata description)\n        external\n        returns (uint256 requestId)\n    {\n        require(bytes(title).length > 0 && bytes(title).length <= MAX_TITLE_LEN, \"title: 1-80 chars\");\n        require(bytes(description).length <= MAX_DESCRIPTION_LEN, \"description: <=600 chars\");\n        require(requests.length < MAX_REQUESTS, \"board full\");\n        requests.push(\n            NeedRequest({\n                submitter: msg.sender,\n                title: title,\n                description: description,\n                linkedWork: \"\",\n                resolved: false,\n                endorsements: 0,\n                submittedAt: block.timestamp\n            })\n        );\n        requestId = requests.length - 1;\n        emit RequestSubmitted(requestId, msg.sender, title);\n    }\n\n    /// @notice Endorse a request, at most once per caller.\n    function endorseRequest(uint256 requestId) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(!endorsedBy[requestId][msg.sender], \"already endorsed\");\n        endorsedBy[requestId][msg.sender] = true;\n        requests[requestId].endorsements += 1;\n        emit RequestEndorsed(requestId, msg.sender, requests[requestId].endorsements);\n    }\n\n    /// @notice Attach or update the bounded accepted-task/app reference (not a resolution).\n    function setLinkedWork(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(bytes(linkedWork).length <= MAX_LINKED_WORK_LEN, \"linkedWork: <=160 chars\");\n        requests[requestId].linkedWork = linkedWork;\n        emit LinkedWorkUpdated(requestId, linkedWork);\n    }\n\n    /// @notice Mark a request resolved, pointing at the accepted task or app.\n    function resolveRequest(uint256 requestId, string calldata linkedWork) external {\n        require(requestId < requests.length, \"unknown request\");\n        require(\n            bytes(linkedWork).length > 0 && bytes(linkedWork).length <= MAX_LINKED_WORK_LEN,\n            \"linkedWork: 1-160 chars\"\n        );\n        NeedRequest storage r = requests[requestId];\n        r.linkedWork = linkedWork;\n        r.resolved = true;\n        emit RequestResolved(requestId, linkedWork);\n    }\n\n    /// @notice Number of submitted requests.\n    function requestCount() external view returns (uint256) {\n        return requests.length;\n    }\n\n    /// @notice Indexed read of one request.\n    function getRequest(uint256 requestId)\n        external\n        view\n        returns (\n            address submitter,\n            string memory title,\n            string memory description,\n            string memory linkedWork,\n            bool resolved,\n            uint256 endorsements,\n            uint256 submittedAt\n        )\n    {\n        require(requestId < requests.length, \"unknown request\");\n        NeedRequest storage r = requests[requestId];\n        return (\n            r.submitter,\n            r.title,\n            r.description,\n            r.linkedWork,\n            r.resolved,\n            r.endorsements,\n            r.submittedAt\n        );\n    }\n\n    /// @notice Indexed read of whether a caller endorsed a request.\n    function hasEndorsed(uint256 requestId, address caller) external view returns (bool) {\n        require(requestId < requests.length, \"unknown request\");\n        return endorsedBy[requestId][caller];\n    }\n}\n"}}},"gas_used":"907802"}