Moral Hazard — New Project Campaign Idea (Season 7)
Moral Hazard is a game-theory experiment played with token streams.
The name is the mechanic.
A ‘moral hazard’ in economics is acting in the hope that the consequences land on somebody else, and that is the position every player is in: your own outcome is settled by what everyone else does next, in public, second by second.
Players pick a side:
Good hopes for stability, Bad for chaos and frequent turnovers.
They are strategies rather than philosophy.
The Constant Flow Agreement and the General Distribution Agreement are not plumbing underneath it - they are the core mechanics. One player at a time holds the Good Spot and receives the combined live stream of everyone else; any number of players take the Bad side, streaming in at a rate they choose. Each time the Good Spot is claimed away, the transferred amount is distributed among all active streamers in proportion to their flowrate, and the next asked amount rises by 1% (it does not climb forever: once a good spot holder hits ‘break-even’, the asked amount eases back down on its own, so the spot stays reachable).
Every outcome is decided by what everyone else does: a holder can lose the spot before breaking even, a streamer in a quiet game can stream out more than distributions return. The app spells bothout in plain language before anyone signs a transaction.
Project live at: https://moralhazard.stream
Invite code for this Forum: dog-squirrel-frog-dog
–
Socials (freshly set up, no posts/followers yet):
–
Note:
A screenrecording video explaining/showcasing all aspects of the project is in the works and will be published soon - I’ll update the post or write a comment for it then.
How the project uses Superfluid
The game contract is a registered Super App extending CFASuperAppBase, and the CFA callbacks onFlowCreated, onFlowUpdated and onInFlowDeleted are the game’s join, adjust and exit — there is no separate join transaction. The flow is the membership.
CFA in, GDA out.
Bad streamers’ flows are aggregated and streamed straight back out to the current holder, recomputed on every join, exit and rate change. Distributions run the other way through a GDA pool with each streamer’s units equal to their flow rate, so proportional-to-flow distribution is the protocol’s arithmetic - the same cost for ten streamers or ten thousand. Each position is also an ERC-721: the Good Spot NFT is transferable, and handing it over redirects the incoming stream with it, while the Bad position is soulbound (EIP-5192), because a stream you opened is not something you can sell out of.
A second outflow, and the fee.
1.337% of all streams goes continuously to a donation recipient the holder picks from a per-game whitelist; it survives the handover, and the next holder can keep it, change it, or let the app pick at random. The list currently includes options like the Superfluid DAO, Giveth or rekt.news (the last deliberately, because a list pointing only inward would be a fan club).
Separately, a 1.337% protocol fee comes off each claim transfer: flat, shown before anyone signs, the project’s only revenue, remainder to the streamers. No token sale, no yield promises, no hidden margins. More on that in the Handbook.
Built with Superfluid’s own tooling, and returning the favour.
The contracts were written against Superfluid’s agent skill; in return the app serves an /AGENTS.md, generated from the live registry so addresses cannot drift, letting an agent play against the verified contracts with no frontend — with a machine-readable Handbook beside it at /handbook.md, indexed from /llms.txt.
Is the project live and ready
Where it actually stands.
The games are live and playable - deployed on Base Mainnet (and Testnet), one game per SuperToken (see table below). The contracts and the game dynamics are settled; what is still open is mostly UI and presentation tasks rather than substance. The one-minute explainer video is a placeholder (marked with “soon”) while I’m working on the real version, and there is a list of smaller polishing tasks. Entry is invite-gated too, so this is not a wide-open public launch.
That is the shape of a one-person project:
Roughly five months of constant work has been enough to get the mechanics right and the contracts onto the first mainnet, but not enough to have everything completly finished yet.
The aim is to have the missing pieces that matter - the explainer first among them - in place by the time Season 7 starts. I would rather set that expectation here than have somebody arrive looking for a finished project.
Open now:
USDCx and SUP on Base, plus fUSDCx on Base Sepolia for the free testrun. POLx on Polygon is most likely next (participants can vote).
Games deploy per (chain, SuperToken) pair from a factory with shared peripherals and the contract only ever talks to the Super Token interface, so any SuperToken on any Superfluid mainnet can be integrated, and the project has been set up this way in mind from the beginning.
The contracts are open-source and source-verified but have had no formal third-party audit - repeated internal and AI-assisted review instead, with a firm audit the first thing the project pays for once it earns enough; the full picture is in the Handbook.
On usage numbers — none worth quoting yet.
The mainnet games are new and the main activity so far is the Base Sepolia trial, where tokens carry no value and much of the streaming is either my own testing or from a small group of beta testers.
So: no total volume, no user count, no daily actives, no current volume. All four become reportable as mainnet usage accumulates, and I would rather return with real dated figures than anchor a campaign on a first week.
Contracts
Base (8453) — one game per SuperToken, everything else shared across them.
| Contract | Address |
|---|---|
| Game — USDCx | 0x3A62B053A9131FA62B640473EF5d57A05f6480A9 |
| Game — SUP | 0x1FF0cEbDabd7a216Ee3948AA050D6c6D6fD78F1E |
MoralHazard implementation (1x per chain) |
0x95861843e84279628943e564c80F6F72Ccb559B7 |
| Factory (1x per chain) | 0x9DEe274794F2CDcd0De368C16d61c9cBaFbea2B2 |
| GoodNFT (1x per chain) | 0xAD950F4631E6aA0be4DFef1E3C1FF03be4Ed55Ac |
| BadNFT (1x per chain) | 0xB121B2b77A1A6d783BD807AE15228Ed19694Cabf |
| DepositManager (1x per chain) | 0xD7644b49ED0EF8bD9EEceBE9151278E4Bcd1755C |
| DonationManager (1x per chain) | 0xb4392B5a49c3a9c032A92f7d0F8b2222337Ec5c2 |
| TimelockController (1x per chain) | 0x8CBf05008848b56815811e81936A4B4D0c34a807 |
Base Sepolia (84532) — the free testrun.
| Contract | Address |
|---|---|
| Game — fUSDCx | 0xCF56AE77dE98E8bC5CD606d83154b9910850b897 |
MoralHazard implementation (1x per chain) |
0x44349bd733801bff5dB5B40d5B51B36aDF776f40 |
| Factory (1x per chain) | 0xddBD22197fE8BD185262FF8C0462917F28573198 |
| GoodNFT (1x per chain) | 0xC881b0143268Df0306Fd13a1188B2D8c6ab61ed3 |
| BadNFT (1x per chain) | 0x612DCBF3Fc75ad584CB0275a3092cBc8f26719F2 |
| DepositManager (1x per chain) | 0x65D6765F300E17Af18b25893A6B47c642501Bf5B |
| DonationManager (1x per chain) | 0x765DF35f31A24D4dA6067A428F70D805C7e8a422 |
| TimelockController (1x per chain) | 0x8A0CBE0ba9f07AF35D635c5CA6146E01170f81ad |
Ethereum (1) — the identity layer, deliberately separate from the game chains.
| Contract | Address |
|---|---|
Profile NFT (MH-PROFILE) |
0xBBFb315dcDF5D73A8486dae37D7882cbF5A6d330 Opensea |
The games are UUPS proxies behind the implementation listed for their chain, and every stateful contract above is owned by that chain’s TimelockController. The same list in machine-readable form is at /AGENTS.md, generated from the live registry.
What sets it apart
A full first game, free on a testnet.
A guided testrun on Base Sepolia covers the whole loop - gasless faucet signature, test tokens, wrapping, opening a stream, connecting to the pool, claiming the spot - every step auto-completing from live on-chain reads.
Someone can learn what a stream is, end to end, at no cost. Start it here.
Personalisation, campaigns and the NFT artwork are one system.
You set how the interface looks and what it defaults to - colour palette, character pack, preferred side, default game, the unit flow rates are shown in - and mint it into a free soulbound Profile NFT on Ethereum Mainnet (collection · /profile), so it follows your wallet to any device instead of sitting in a browser that forgets. Because those settings are public on-chain data rather than private account state, you can enter anyone’s address, ENS or token number, try their look on, and keep it if you want it.

Campaigns act on the same settings: for the length of a season, characters, colours and the default token are replaced for everyone. The character sets are the part worth noticing. A restricted set can only be taken into a profile while its campaign is live. Afterwards whoever took it keeps it - it still renders for them, and anyone who looks up their profile still sees it - but it can no longer be minted by a profile that does not already hold it. It is one-way, too: replace it with another set
and it does not come back, so what you keep is a decision rather than a preference.
All of it surfaces in the artwork. Both position NFTs draw themselves from live on-chain state and from their own owner’s profile, so each one wears that player’s character. The Good Spot NFT is where it shows most, because the position moves: claim the spot and it becomes your figure, lose it and it becomes the next holder’s. No Profile NFT and it falls back to the defaults; an active campaign and both wear the campaign’s characters instead.
Governance is visible before it happens.
Every administrative change runs through a TimelockController and surfaces on the affected game’s pages with a countdown, so anyone can leave before it lands. Pausing freezes new activity only; the self-service exit is always open. The Handbook documents what an administrator could change; live positions are at /spots, and players vote on the next SuperToken to be added via /votes.
Entry is invite-gated by design
Codes are four-animal strings, further invites earned through participation rather than bought. dog-squirrel-frog-dog is seeded with 100 slots for readers of this forum and opens every game; connecting a wallet gets you your own combination, so anyone you bring arrives on your invite rather than mine.
How the project benefits the DAO
A use case streams make possible, not one they improve.
Most integrations add streaming to something that already worked - payroll, subscriptions, vesting. Remove the Constant Flow Agreement from Moral Hazard and there is no game left: a position whose value moves every second, and a distribution split by flow rate rather than headcount, are why it exists. It reaches two groups a campaign can serve - people who have never felt a stream, and Superfluid-native users who already hold SuperTokens and want somewhere to use them.
A Superfluid-themed UI campaign.
One is already built, to be revealed when Season 7 starts. It would not wash off afterwards: the character pack a player takes is written into their Profile NFT, and campaign theming renders into the position NFTs — so a Superfluid season leaves Superfluid characters in players’ own NFTs long after it ends.
On the KPI — participation, not volume.
I would rather be measured on active positions per day: holding a Good Spot, or having a Bad stream active. It is what the app already computes for itself, server-side from on-chain truth rather than client reports, and already what decides when a player earns further invites - so mirroring it needs nothing new built and nothing self-reported. A season ending with one large wallet streaming heavily moves a volume number without moving what the season was for; what matters is that people stream, and were still there the next day.
The trade-off, stated rather than left to be found.
A count is easier to farm than an amount, and there is no minimum flow rate in the contract - the CFA buffer and the deposit are both sized from the flow rate, so they price a large position but barely touch a tiny one. What blunts it is the door rather than the conomics: entry is invite-gated and invites are earned, ten participation points for one, so wallets cannot simply be spun up; the 5% per-user cap limits any single wallet on top. If the DAO would rather have a floor as well, a minimum flow rate for attribution is easy to apply.
Who is behind this.
I’m Markus, going by the online alias seliqui - so Moral Hazard is primarily one person’s work. Moral Hazard distills my expertise of +22 years as a Mediadesigner as well as the knowledge gathered whilst being on the Minerva Wallet Team, building the FRACTION Token, and being with Superfluid as a Sentinel operator, Ambassador and also a DAO Delegate.
So I am not arriving here as a stranger to the ecosystem; and since this proposal concerns a project I build and operate myself, better to say so plainly.
You can find more about me here:
