Contracts and addresses
Chain id 10143 (Monad testnet), RPC https://testnet-rpc.monad.xyz, explorer testnet.monadscan.com.
Deployed addresses
| Contract | Address | Block |
|---|---|---|
| IdentityRegistry | 0xa67ef35974bc8874318d249b6e74c7bd5870d1db | 63285812 |
| CommunityRegistry | 0x41c19889a3218000482a1cd6e13640edcd16cf32 | 63285812 |
| PostRegistry | 0xaC74A6AF7Ec96e28F2885916673EF3B9aACF10F5 | 63379890 |
| ChronoFeed | 0xF9CC631A04C5398Be97d5410303Cd61bD56d1a79 | 63379890 |
| HotFeed | 0xAF50B9FE82E42a7fCb9B7a31BC1DDB9dd02a661d | 63379890 |
| BestFeed | 0x383C7Af1CA32f72f916a14bb03f95ec1D98A14E6 | 63379890 |
| ControversialFeed | 0x6A94E5a83102b04c5965F8A756e2cB84c6B7170c | 63379890 |
| AlgorithmRegistry | 0xeEC08F90CFe669e3366933cF1C72fe4f08A3F289 | 63379890 |
No contract has an admin function. Even the development team cannot remove an algorithm, delete a post, or ban an account.
PostRegistry
Holds posts, votes, and the entire karma ledger.
uint256 public nextPostId = 1;
mapping(address => int256) public karmaOf;
mapping(uint256 => mapping(address => bool)) public hasLiked;
mapping(uint256 => mapping(address => bool)) public hasDisliked;
struct Post {
address author;
uint48 createdAt;
uint48 parentId; // 0 = post, non-zero = comment
uint32 likeCount; // raw
uint32 weightedLikes; // weighted
uint32 dislikeCount; // raw
uint32 weightedDislikes; // weighted
uint32 repostCount; // reserved
uint32 replyCount;
}
function post(string text, string mediaURI) external;
function reply(uint48 parentId, string text, string mediaURI) external;
function postOf(uint256 id) external view returns (Post memory);
function postsOf(uint256[] ids) external view returns (Post[] memory);
function like(uint256 id) external;
function dislike(uint256 id) external;
function unlike(uint256 id) external;
function undislike(uint256 id) external;
function karmaOf(address) external view returns (int256); // 100 points = 1 vote
function weightOf(address) external view returns (uint32); // 0–200Events: PostCreated, Liked(id, account, weight), Unliked, Disliked(id, account, weight), Undisliked.
Rules: you cannot vote on your own post; unvoting returns exactly the weight that was added; if karma is negative, weight is 0. See Karma and weight.
IdentityRegistry
Name and metadata, nothing else.
function register(bytes32 handle, string metadataURI) external;
function changeHandle(bytes32 newHandle) external; // releases the old name
function setMetadata(string metadataURI) external;Events: Registered, HandleChanged, MetadataUpdated. A handle is bytes32, 3–21 characters a–z0–9_. Changing a name releases the old name in the same transaction.
CommunityRegistry
A community is a public label; the contract cannot delete posts, ban accounts, or transfer names.
function create(bytes32 name, string metadataURI) external;
function join(bytes32 name) external;
function leave(bytes32 name) external;
function setMetadata(bytes32 name, string metadataURI) external; // creator only
function isValidName(bytes32 name) public pure returns (bool);Events: Created, Joined, Left, MetadataUpdated. join/leave are idempotent; creating a community does not automatically join it. See Communities.
AlgorithmRegistry
The algorithm list and default slots.
uint8 public constant SLOT_FEED = 0;
uint8 public constant SLOT_EXPLORE = 1;
function register(IFeedAlgorithm algo) external returns (uint256 id);
function algorithmAt(uint256 id) external view returns (address);
function algorithmCount() external view returns (uint256);
function setMyAlgorithm(uint8 slot, uint256 algorithmId) external;
function algorithmOf(address user, uint8 slot) external view returns (address);Events: AlgorithmRegistered, AlgorithmSelected. register requires no permission. See Algorithms.