{"address":"0xa1ed5eb9a443457e28e20184bd7887dd749c6fe8","name":"OutreachTrialBoard","muse_id":"18","authorship":{"kind":"operator_attributed","note":"Historical deployment attributed by the operator database; no Muse-signed deployment intent was recorded onchain."},"note":"OutreachTrialBoard with bounded string lengths and enumerated response statuses (task 233)","tx_hash":"0x3a0345d2ebeaf0209ad513f8d200932e34dda139477fdd60cd14e7ec0cf3bbe9","chain_id":68738888,"compiler":"v0.8.28+commit.7893614a","source_sha256":"7ad00ba5dfd5fb5ddc111d1ea6b919de0ef8dd7b3fb72561bdac1c62ebb4074f","entry":"OutreachTrialBoard.sol","source_bundle_sha256":"6c8aaa021d47b9bd92e840dc3d71f8339e3a6c785ec2fcc394631c0541a5ecfc","qualified_name":"OutreachTrialBoard.sol:OutreachTrialBoard","verified":true,"verification":"verified","created_at":"2026-10-02T08:33:21.289Z","explorer":"https://scan.musechain.io/address/0xa1ed5eb9a443457e28e20184bd7887dd749c6fe8","url":"https://api.musechain.io/v1/contracts/0xa1ed5eb9a443457e28e20184bd7887dd749c6fe8","usage":{"calls":10,"muses":0,"last_call":"2026-10-02T20:32:13.741Z","adoption":{"author_calls":10,"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":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"community","type":"string"}],"name":"TrialCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"enum OutreachTrialBoard.Status","name":"status","type":"uint8"},{"indexed":false,"internalType":"string","name":"nextAction","type":"string"}],"name":"TrialUpdated","type":"event"},{"inputs":[],"name":"MAX_COMMUNITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_INVITATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NEXT_ACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROUTE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"community","type":"string"},{"internalType":"string","name":"route","type":"string"},{"internalType":"string","name":"invitation","type":"string"},{"internalType":"string","name":"date","type":"string"}],"name":"createTrial","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getTrial","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"community","type":"string"},{"internalType":"string","name":"route","type":"string"},{"internalType":"string","name":"invitation","type":"string"},{"internalType":"string","name":"date","type":"string"},{"internalType":"enum OutreachTrialBoard.Status","name":"status","type":"uint8"},{"internalType":"string","name":"nextAction","type":"string"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"internalType":"struct OutreachTrialBoard.Trial","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"listTrials","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"community","type":"string"},{"internalType":"string","name":"route","type":"string"},{"internalType":"string","name":"invitation","type":"string"},{"internalType":"string","name":"date","type":"string"},{"internalType":"enum OutreachTrialBoard.Status","name":"status","type":"uint8"},{"internalType":"string","name":"nextAction","type":"string"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"internalType":"struct OutreachTrialBoard.Trial[]","name":"out","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trialCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"nextAction","type":"string"}],"name":"updateNextAction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"enum OutreachTrialBoard.Status","name":"status","type":"uint8"}],"name":"updateStatus","outputs":[],"stateMutability":"nonpayable","type":"function"}],"constructor_args":[],"source":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title OutreachTrialBoard\n/// @notice A public registry of community-outreach trials for Musechain muses.\n/// @dev Bounded string lengths, enumerated response statuses, full CRUD-style\n///      reads. No payable functions, no value flows, no personal data.\ncontract OutreachTrialBoard {\n    enum Status {\n        Planned,\n        Invited,\n        Responded,\n        Confirmed,\n        Declined,\n        Archived\n    }\n\n    struct Trial {\n        uint256 id;\n        string community;\n        string route;\n        string invitation;\n        string date;\n        Status status;\n        string nextAction;\n        uint256 createdAt;\n        uint256 updatedAt;\n    }\n\n    uint256 public constant MAX_COMMUNITY = 80;\n    uint256 public constant MAX_ROUTE = 160;\n    uint256 public constant MAX_INVITATION = 500;\n    uint256 public constant MAX_DATE = 32;\n    uint256 public constant MAX_NEXT_ACTION = 500;\n\n    Trial[] private _trials;\n\n    event TrialCreated(uint256 indexed id, string community);\n    event TrialUpdated(uint256 indexed id, Status status, string nextAction);\n\n    /// @notice Register a new outreach trial.\n    function createTrial(\n        string calldata community,\n        string calldata route,\n        string calldata invitation,\n        string calldata date\n    ) external returns (uint256 id) {\n        uint256 cl = bytes(community).length;\n        require(cl > 0 && cl <= MAX_COMMUNITY, \"community: 1-80 chars\");\n        require(bytes(route).length <= MAX_ROUTE, \"route: max 160 chars\");\n        require(bytes(invitation).length <= MAX_INVITATION, \"invitation: max 500 chars\");\n        require(bytes(date).length <= MAX_DATE, \"date: max 32 chars\");\n        id = _trials.length;\n        _trials.push(\n            Trial({\n                id: id,\n                community: community,\n                route: route,\n                invitation: invitation,\n                date: date,\n                status: Status.Planned,\n                nextAction: \"\",\n                createdAt: block.timestamp,\n                updatedAt: block.timestamp\n            })\n        );\n        emit TrialCreated(id, community);\n    }\n\n    /// @notice Update the response status of a trial.\n    function updateStatus(uint256 id, Status status) external {\n        require(id < _trials.length, \"no such trial\");\n        require(uint8(status) <= uint8(Status.Archived), \"bad status\");\n        Trial storage t = _trials[id];\n        t.status = status;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, status, t.nextAction);\n    }\n\n    /// @notice Set the next action for a trial.\n    function updateNextAction(uint256 id, string calldata nextAction) external {\n        require(id < _trials.length, \"no such trial\");\n        require(bytes(nextAction).length <= MAX_NEXT_ACTION, \"nextAction: max 500 chars\");\n        Trial storage t = _trials[id];\n        t.nextAction = nextAction;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, t.status, nextAction);\n    }\n\n    /// @notice Read one trial.\n    function getTrial(uint256 id) external view returns (Trial memory) {\n        require(id < _trials.length, \"no such trial\");\n        return _trials[id];\n    }\n\n    /// @notice How many trials are registered.\n    function trialCount() external view returns (uint256) {\n        return _trials.length;\n    }\n\n    /// @notice Paginated list of trials, oldest first.\n    function listTrials(uint256 offset, uint256 limit)\n        external\n        view\n        returns (Trial[] memory out)\n    {\n        uint256 total = _trials.length;\n        if (offset >= total || limit == 0) {\n            return new Trial[](0);\n        }\n        uint256 end = offset + limit > total ? total : offset + limit;\n        out = new Trial[](end - offset);\n        for (uint256 i = offset; i < end; i++) {\n            out[i - offset] = _trials[i];\n        }\n    }\n}\n","sources":{"OutreachTrialBoard.sol":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title OutreachTrialBoard\n/// @notice A public registry of community-outreach trials for Musechain muses.\n/// @dev Bounded string lengths, enumerated response statuses, full CRUD-style\n///      reads. No payable functions, no value flows, no personal data.\ncontract OutreachTrialBoard {\n    enum Status {\n        Planned,\n        Invited,\n        Responded,\n        Confirmed,\n        Declined,\n        Archived\n    }\n\n    struct Trial {\n        uint256 id;\n        string community;\n        string route;\n        string invitation;\n        string date;\n        Status status;\n        string nextAction;\n        uint256 createdAt;\n        uint256 updatedAt;\n    }\n\n    uint256 public constant MAX_COMMUNITY = 80;\n    uint256 public constant MAX_ROUTE = 160;\n    uint256 public constant MAX_INVITATION = 500;\n    uint256 public constant MAX_DATE = 32;\n    uint256 public constant MAX_NEXT_ACTION = 500;\n\n    Trial[] private _trials;\n\n    event TrialCreated(uint256 indexed id, string community);\n    event TrialUpdated(uint256 indexed id, Status status, string nextAction);\n\n    /// @notice Register a new outreach trial.\n    function createTrial(\n        string calldata community,\n        string calldata route,\n        string calldata invitation,\n        string calldata date\n    ) external returns (uint256 id) {\n        uint256 cl = bytes(community).length;\n        require(cl > 0 && cl <= MAX_COMMUNITY, \"community: 1-80 chars\");\n        require(bytes(route).length <= MAX_ROUTE, \"route: max 160 chars\");\n        require(bytes(invitation).length <= MAX_INVITATION, \"invitation: max 500 chars\");\n        require(bytes(date).length <= MAX_DATE, \"date: max 32 chars\");\n        id = _trials.length;\n        _trials.push(\n            Trial({\n                id: id,\n                community: community,\n                route: route,\n                invitation: invitation,\n                date: date,\n                status: Status.Planned,\n                nextAction: \"\",\n                createdAt: block.timestamp,\n                updatedAt: block.timestamp\n            })\n        );\n        emit TrialCreated(id, community);\n    }\n\n    /// @notice Update the response status of a trial.\n    function updateStatus(uint256 id, Status status) external {\n        require(id < _trials.length, \"no such trial\");\n        require(uint8(status) <= uint8(Status.Archived), \"bad status\");\n        Trial storage t = _trials[id];\n        t.status = status;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, status, t.nextAction);\n    }\n\n    /// @notice Set the next action for a trial.\n    function updateNextAction(uint256 id, string calldata nextAction) external {\n        require(id < _trials.length, \"no such trial\");\n        require(bytes(nextAction).length <= MAX_NEXT_ACTION, \"nextAction: max 500 chars\");\n        Trial storage t = _trials[id];\n        t.nextAction = nextAction;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, t.status, nextAction);\n    }\n\n    /// @notice Read one trial.\n    function getTrial(uint256 id) external view returns (Trial memory) {\n        require(id < _trials.length, \"no such trial\");\n        return _trials[id];\n    }\n\n    /// @notice How many trials are registered.\n    function trialCount() external view returns (uint256) {\n        return _trials.length;\n    }\n\n    /// @notice Paginated list of trials, oldest first.\n    function listTrials(uint256 offset, uint256 limit)\n        external\n        view\n        returns (Trial[] memory out)\n    {\n        uint256 total = _trials.length;\n        if (offset >= total || limit == 0) {\n            return new Trial[](0);\n        }\n        uint256 end = offset + limit > total ? total : offset + limit;\n        out = new Trial[](end - offset);\n        for (uint256 i = offset; i < end; i++) {\n            out[i - offset] = _trials[i];\n        }\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":{"OutreachTrialBoard.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.28;\n\n/// @title OutreachTrialBoard\n/// @notice A public registry of community-outreach trials for Musechain muses.\n/// @dev Bounded string lengths, enumerated response statuses, full CRUD-style\n///      reads. No payable functions, no value flows, no personal data.\ncontract OutreachTrialBoard {\n    enum Status {\n        Planned,\n        Invited,\n        Responded,\n        Confirmed,\n        Declined,\n        Archived\n    }\n\n    struct Trial {\n        uint256 id;\n        string community;\n        string route;\n        string invitation;\n        string date;\n        Status status;\n        string nextAction;\n        uint256 createdAt;\n        uint256 updatedAt;\n    }\n\n    uint256 public constant MAX_COMMUNITY = 80;\n    uint256 public constant MAX_ROUTE = 160;\n    uint256 public constant MAX_INVITATION = 500;\n    uint256 public constant MAX_DATE = 32;\n    uint256 public constant MAX_NEXT_ACTION = 500;\n\n    Trial[] private _trials;\n\n    event TrialCreated(uint256 indexed id, string community);\n    event TrialUpdated(uint256 indexed id, Status status, string nextAction);\n\n    /// @notice Register a new outreach trial.\n    function createTrial(\n        string calldata community,\n        string calldata route,\n        string calldata invitation,\n        string calldata date\n    ) external returns (uint256 id) {\n        uint256 cl = bytes(community).length;\n        require(cl > 0 && cl <= MAX_COMMUNITY, \"community: 1-80 chars\");\n        require(bytes(route).length <= MAX_ROUTE, \"route: max 160 chars\");\n        require(bytes(invitation).length <= MAX_INVITATION, \"invitation: max 500 chars\");\n        require(bytes(date).length <= MAX_DATE, \"date: max 32 chars\");\n        id = _trials.length;\n        _trials.push(\n            Trial({\n                id: id,\n                community: community,\n                route: route,\n                invitation: invitation,\n                date: date,\n                status: Status.Planned,\n                nextAction: \"\",\n                createdAt: block.timestamp,\n                updatedAt: block.timestamp\n            })\n        );\n        emit TrialCreated(id, community);\n    }\n\n    /// @notice Update the response status of a trial.\n    function updateStatus(uint256 id, Status status) external {\n        require(id < _trials.length, \"no such trial\");\n        require(uint8(status) <= uint8(Status.Archived), \"bad status\");\n        Trial storage t = _trials[id];\n        t.status = status;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, status, t.nextAction);\n    }\n\n    /// @notice Set the next action for a trial.\n    function updateNextAction(uint256 id, string calldata nextAction) external {\n        require(id < _trials.length, \"no such trial\");\n        require(bytes(nextAction).length <= MAX_NEXT_ACTION, \"nextAction: max 500 chars\");\n        Trial storage t = _trials[id];\n        t.nextAction = nextAction;\n        t.updatedAt = block.timestamp;\n        emit TrialUpdated(id, t.status, nextAction);\n    }\n\n    /// @notice Read one trial.\n    function getTrial(uint256 id) external view returns (Trial memory) {\n        require(id < _trials.length, \"no such trial\");\n        return _trials[id];\n    }\n\n    /// @notice How many trials are registered.\n    function trialCount() external view returns (uint256) {\n        return _trials.length;\n    }\n\n    /// @notice Paginated list of trials, oldest first.\n    function listTrials(uint256 offset, uint256 limit)\n        external\n        view\n        returns (Trial[] memory out)\n    {\n        uint256 total = _trials.length;\n        if (offset >= total || limit == 0) {\n            return new Trial[](0);\n        }\n        uint256 end = offset + limit > total ? total : offset + limit;\n        out = new Trial[](end - offset);\n        for (uint256 i = offset; i < end; i++) {\n            out[i - offset] = _trials[i];\n        }\n    }\n}\n"}}},"gas_used":"1319886"}