Skip to content

Contracts and addresses

Chain id 10143 (Monad testnet), RPC https://testnet-rpc.monad.xyz, explorer testnet.monadscan.com.

Deployed addresses

ContractAddressBlock
IdentityRegistry0xa67ef35974bc8874318d249b6e74c7bd5870d1db63285812
CommunityRegistry0x41c19889a3218000482a1cd6e13640edcd16cf3263285812
PostRegistry0xaC74A6AF7Ec96e28F2885916673EF3B9aACF10F563379890
ChronoFeed0xF9CC631A04C5398Be97d5410303Cd61bD56d1a7963379890
HotFeed0xAF50B9FE82E42a7fCb9B7a31BC1DDB9dd02a661d63379890
BestFeed0x383C7Af1CA32f72f916a14bb03f95ec1D98A14E663379890
ControversialFeed0x6A94E5a83102b04c5965F8A756e2cB84c6B7170c63379890
AlgorithmRegistry0xeEC08F90CFe669e3366933cF1C72fe4f08A3F28963379890

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.

solidity
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–200

Events: 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.

solidity
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.

solidity
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.

solidity
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.

Documentation for Monad testnet. It describes what is actually running.