Skip to content
Player's Guide

QING — Venues

One-line pitch: A QING is a venue — part chatroom, part marketplace, part members-only club. Every QING wraps a token and gives it a location.

A QING is the game’s unit of place. Every QING:

  • Wraps a real underlying token (DAI, an NFT project’s token, a meme coin, another QING — anything). Holders of that token get special status here.
  • Lives at a unique coordinate (Waat) on the MAP.
  • Has an entry fee (CoverCharge), a guest list with 1-day passes, and bouncers who control access.
  • Supports chat — members speak via Chat(myLAU, "msg"), which emits the QING’s own public chat event.
  • Lets big holders of its underlying token become moderators automatically.

If you’ve been to a Discord server with role-gated channels, you already understand a QING.

  • Closest analogy: a token-gated Discord channel — hold the token, walk in; don’t, get bounced.
  • Or: a Uniswap LP as a social space — wrapped around an underlying asset, with activity generating value.
  • Or: a Club Penguin room with a cover charge.
Dysnomia term What it maps to
Waat This venue’s map coordinates
Asset The token this QING wraps
Cover Charge Entry fee paid in Asset
Guest List (_list) 1-day passes — expires 24h after you Join
Bouncer A moderator who can configure the venue
Staff Addresses explicitly marked as staff (always authorized)
CROWS Holding 25+ CROWS auto-qualifies you as a bouncer
GWAT A flag indicating this QING is a derivative / personal fork
  • JoinQING.Join(myLAU). Pays the cover if required, writes you to the guest list for 24h.
  • ChatQING.Chat(myLAU, "hello"). Must be admitted. Use CHOA Chat when you also want its MAI reward calculation.
  • Stay — once joined, you’re admitted for 24h. Re-pay cover after that.
  • Bouncer actions (if you qualify) — setCoverCharge, setBouncerDivisor, setStaff, setGuestlist, removeGuest.
  • Owner actionsAllowCROWS, market-rate management, withdrawals and MultiOwnable changes require direct QING ownership. Owner and bouncer are separate roles.

Use these calls here. Simulations preview the current state; each confirmed call is a separate transaction.

Venue assetResolve your player or venue above the call forms.
VenueAsset.allowance(address owner, address spender)Read

Open this function to load its call form.

VenueAsset.approve(address spender, uint256 value)Simulate / call

Open this function to load its call form.

QINGResolve your player or venue above the call forms.
QING.Admitted(address UserToken)Read

Open this function to load its call form.

QING.Join(address UserToken)Simulate / call

Open this function to load its call form.

QING.setCoverCharge(uint256 _c)Simulate / call

Open this function to load its call form.

QING.setBouncerDivisor(uint16 _d)Simulate / call

Open this function to load its call form.

QING.setStaff(address _a, bool active)Simulate / call

Open this function to load its call form.

QING.setGuestlist(address _a)Simulate / call

Open this function to load its call form.

QING.removeGuest(address _a)Simulate / call

Open this function to load its call form.

QING.AllowCROWS(bool _b)Simulate / call

Open this function to load its call form.

QING.Withdraw(address what, uint256 amount)Simulate / call

Open this function to load its call form.

CHOA0x0f5a352fd4cA4850c2099C15B3600ff085B66197
CHOA.Chat(address Qing, string MSG)Simulate / call

Open this function to load its call form.

  • Join cost: CoverCharge amount of the venue’s underlying asset (can be zero). Paid from your wallet (not YUE) via transferFrom.
  • Chat reward: up to 1 of the venue’s token per message via MAI, if you hold any.
  • Bouncer actions: gas only.

If the cover charge is zero, Admitted returns true without a Join. With a nonzero cover, the LAU needs an unexpired guest-list entry. Join creates that entry for 24 hours and collects the cover unless a bouncer already guestlisted the LAU.

To be a bouncer, you need one of:

  • Being on the staff list (always authorized).
  • Holding 25+ CROWS (if the venue allows CROWS).
  • Holding enough of the underlying asset (specifically totalSupply / BouncerDivisor).
  • Being the asset’s owner (via MAP ownership lookup).

The venue will refuse to let you Chat if:

  • Its underlying asset is on MAP’s forbidden list (Forbidden).
  • You’re not admitted (NotAdmitted).
  • Your guest-list entry has expired and you haven’t re-paid (PayCover).

QINGs are deployed by MAP (original QINGs) and GWAT (personal derivatives). They check player identity with CHO, log chat through the chat pipeline (VOID and friends), and plug into the power chain via MAI. Battles at a venue are handled by WAR.

Q: How long does a Join last? A: 24 hours. After that, you need to re-Join (and pay cover again if there is one).

Q: Can the cover charge change? A: Yes — bouncers can set it. Changes take effect immediately for new Joins. Already-joined players are safe until their 24h runs out.

Q: What’s the deal with CROWS? A: CROWS is a “VIP” token. Holding 25+ of it usually gives you bouncer privileges at a venue. A direct QING owner can disable CROWS-based bouncer authority through AllowCROWS(false).

Q: What’s a GWAT? A: Venues come in two flavors: originals (registered on MAP) and derivatives (GWATs — your personal forks). The GWAT boolean on each QING tells you which it is. The flag is derived from the Luo value at construction time.

Q: Can I host a QING without holding the underlying token? A: Yes. MAP.New does not check token ownership, and its transaction origin becomes initial QING staff. Only one MAP QING can exist for an underlying token, so creating one is a consequential first-come action. GWAT derivatives follow a different path.

Q: What if the underlying token gets forbidden later? A: The QING still exists, but Chat and similar actions will revert Forbidden(asset). Effectively the venue goes cold.


Want the Solidity? The contract reference lives at technical/docs/domain/dan/QING.md.