BBS-Coin is an ERC-20 token system designed to incentivize participation in Bulletin Board Systems (BBSes). It is explicitly not marketed as a financial instrument or investment. Tokens represent points, reputation, participation, or governance weight depending on how a community chooses to use them.
Key properties:
Think of BBS-Coin like arcade tickets:
BbsToken (ERC-20)
↑ mint (mintToTreasury)
BbsTreasury (Safe-owned)
↓ fund (fundDistributor)
BbsMerkleDistributor (per BBS)
↓ claim (claim / claimFor)
Contract Purpose
BbsToken ERC-20 token
BbsTreasury Minting + distributor funding
DistributorRegistry Discovery + metadata
⸻
A sysop:
A sysop does not:
Distributor Lifecycle (with code references)
1. Distributor is deployed by the Foundation
→ BbsTreasury.deployDistributor(sysopOwner, bbsId, metadataURI)
2. Distributor is registered for discovery
→ DistributorRegistry.register(...) (called internally by Treasury)
3. Distributor is funded with tokens
→ BbsTreasury.fundDistributor(distributor, amount)
4. Sysop publishes an epoch
→ BbsMerkleDistributor.publishEpoch(bytes32 root, string uri)
5. Users claim tokens
→ BbsMerkleDistributor.claim(epoch, amount, proof)
→ or gas-sponsored: claimFor(account, epoch, amount, proof)
Epoch Model
keccak256(abi.encodePacked(account, amount))
Ethers v6 equivalent:
keccak256(solidityPacked(["address","uint256"],[account, amountWei]))
For each epoch, sysop tooling must persist:
If these artifacts are lost, users may be unable to claim even though the root exists on-chain.
⸻
The Foundation (via Safe) is the only authority that:
→ BbsTreasury.mintToTreasury(amount)
→ BbsTreasury.fundDistributor(distributor, amount)
→ DistributorRegistry.register(...)
→ BbsTreasury.setDistributorEnabled(distributor, enabled)
→ BbsTreasury.revokeFromDistributor(...)
Token Setup
Recommended:
⸻
Design Principles
Possible Future Extensions
BBS-Coin exists to make BBSes more fun — not to turn them into casinos.
⸻
Further Reading