CHOA — Gameplay Controller
One-line pitch: CHOA is the contract you actually interact with when you play or chat. Two verbs, one contract.
What this is
Section titled “What this is”CHOA is the top-level gameplay API. Two headline functions:
Play(YourLAUAddress)— registers the LAU, uses the YUE previously created through SEI, and gives first-time players the YUE token’s starter mint.Chat(QingAddress, "your message")— sends a message into a QING and (if you hold that venue’s token) pays you MAI rewards.
There’s also Yuan(Currency) — a view function that returns your weighted holdings in a given token across wallet + LAU + YUE combined. This is the Yuan number that ZI uses to spin up your power.
If you’re picking one contract to point a frontend button at, it’s CHOA.
If you’ve played a web3 game before
Section titled “If you’ve played a web3 game before”- Closest analogy: a game-client dispatcher — every player action flows through here.
- Or: the router contract in DeFi (Uniswap’s Router) — the user-facing simplifier on top of the actual mechanics.
- Or: the
PlayerControllerin a Unity game — input handler that talks to all the subsystems.
| Dysnomia term | What it maps to |
|---|---|
| CHOA | The play/chat controller |
| Play() | Onboarding/activation call |
| Chat() | Send a message; earn MAI if eligible |
| Yuan(Currency) | Your total weighted balance of a token across all buckets |
What you actually do with it
Section titled “What you actually do with it”- First login: call
SEI.Start(YourLAU, name, symbol), thenPlay(YourLAU). Play gives the first-time YUE token mint and records the player. - Chat: call
Chat(QingAddress, "gm")when you want to message at a venue. Returns the Charge of that chat (your power at that moment). - Check Yuan: read-only view to see “what’s my weighted holdings in X token right now?”
- You’ll call CHOA constantly if you’re an active player. It’s the main UI contract.
Use these calls here. Simulations preview the current state; each confirmed call is a separate transaction.
0x3dC54d46e030C42979f33C9992348a990acb6067SEI.Start(address LauToken, string YueName, string YueSymbol)Simulate / call
Open this function to load its call form.
0x0f5a352fd4cA4850c2099C15B3600ff085B66197CHOA.Play(address UserTokenAddress)Simulate / call
Open this function to load its call form.
CHOA.Chat(address Qing, string MSG)Simulate / call
Open this function to load its call form.
CHOA.Yuan(address Currency)Read
Open this function to load its call form.
Rewards / costs
Section titled “Rewards / costs”- Cost: gas per call.
Chathas no extra fee beyond any cover charge the QING itself requires. - Reward: MAI rewards on chat (up to 1 venue-token per message), initial YUE starter mint on your first Play().
Requirements & gating
Section titled “Requirements & gating”Play(): you need an owned LAU and an existing YUE fromSEI.Start().Chat(): you need to be admitted at the QING (passes QING’s own gating rules, which may include token holdings or guest-list entries).
Where it connects
Section titled “Where it connects”Sits on top of SEI (session state) and YUE (your bank). Drives QING.Chat. Feeds ZI via Yuan. Registers an already-started player for CHOA gameplay.
Quick FAQ
Section titled “Quick FAQ”Q: Do I have to call Play() every session? A: No — once is sufficient to register the player and receive the first-play mint. SEI onboarding and LAU creation are separate calls.
Q: What’s the relationship between CHOA.Chat and QING.Chat? A: CHOA.Chat wraps QING.Chat and handles the reward accounting (MAI mint) and Yuan effects. Always go through CHOA.
Q: What counts as “weighted holdings” in Yuan? A: Your wallet balance, your LAU balance, and your YUE balance in that currency — summed with appropriate weights.
Q: Can a different contract call Chat on my behalf? A: Depends on approvals. Normally you call it from your own wallet.
Want the Solidity? The contract reference lives at
technical/docs/domain/sky/CHOA.md.