For developers
Read the records with any client.
Contribution records sit in one small contract on Robinhood Chain with no owner and no key. You do not need Commito's servers to read or check them.
Read records
Any JSON-RPC endpoint for Robinhood Chain works. The example uses viem; ethers or a plain eth_call work the same way. The record book is not deployed yet, so the address below is a placeholder until the deployment is published here.
import { createPublicClient, http, parseAbi } from "viem";
const client = createPublicClient({
transport: http("https://rpc.mainnet.chain.robinhood.com"), // chain id 4663
});
const book = {
address: "0x… (published after deployment)",
abi: parseAbi([
"function recordCount() view returns (uint256)",
"function getRecord(uint256 id) view returns ((uint256 id, address author, uint8 kind, uint8 role, uint32 reviewCount, uint64 recordedBlock, uint64 recordedAt, bytes32 repoHash, bytes32 refHash, bytes32 noteHash, string repo, string ref))",
"function reviewsOf(uint256 id, uint256 offset, uint256 limit) view returns ((address reviewer, uint64 reviewedBlock, uint64 reviewedAt)[])",
]),
};
const total = await client.readContract({ ...book, functionName: "recordCount" });
const last = await client.readContract({ ...book, functionName: "getRecord", args: [total] });
const reviewers = await client.readContract({ ...book, functionName: "reviewsOf", args: [total, 0n, 100n] });Contract
CommitoRecordBook, Solidity 0.8.28. No owner, no admin, no fee, no pause, no upgrade path, no constructor arguments. It never holds funds and does not use the $COMMITO token. Block numbers come from Robinhood Chain's own L2 counter (ArbSys), not from the parent chain.
| Function | Type | What it does |
|---|---|---|
| record(repo, ref, kind, role, noteHash) | write | kind 1 = commit (40-char lower-case SHA), 2 = pull request (number). Role 1 to 6. One record per wallet per exact reference. |
| review(id) | write | Co-sign record id. Any wallet except its author, once per wallet. |
| recordCount() / records(fromId, limit) | read | Total and pages of up to 100 records with their plain references. |
| getRecord(id) | read | One record: author, kind, role, review count, block, time, hashes, repo, ref. |
| idsByAuthor / idsForRepo | read | Record ids of a wallet or of a repository hash, oldest first, 100 per page. |
| reviewsOf(id, offset, limit) | read | Reviewer addresses with block and time. |
| idOf(author, repoHash, refHash, kind) | read | The record id for an exact reference, or 0. |
Hash rules
Hashes are keccak-256 of the exact UTF-8 text. Repositories are lower case, because GitHub treats names without regard to case. The contract computes the hashes itself from the strings it is given, so the stored text and the stored hashes always agree.
import { keccak256, stringToBytes } from "viem";
const repoHash = keccak256(stringToBytes("ethereum/go-ethereum")); // lower-case owner/name
const refHash = keccak256(stringToBytes("4f1c...e09a")); // full 40-char SHA, or "1024" for PR #1024
// countForRepo(repoHash) and idsForRepo(repoHash, offset, limit) list the records of one repository.The verify page does exactly this in your browser.
Write
Writes are ordinary transactions from the contributor's or reviewer's own wallet. The site dry-runs each call first, so a mistake such as reviewing your own record is explained before the wallet opens. Gas is the only cost.
Developer API planned
A hosted API with contribution data per repository, wallet and reviewer, webhooks for new records and bulk export is planned. It does not exist yet; nothing on this site sells access to it. Until then, read the chain directly as shown above.
Agent tools planned
A tool server that lets coding assistants search your hub, read pull request reviews and prepare (never sign) a contribution record is planned. Any action that writes on chain would still need the person's own wallet signature.
llms.txt
A plain-text summary of Commito for language models and crawlers lives at /llms.txt.