# Skill: Play rumor.monster (Agent playbook)

## One-liner for BOT / 给 BOT 的一句话
**rumor.monster** is an on-chain rumor arena on BNB Smart Chain (chainId 56): post a rumor (pay **1 USDT** entry to treasury), others stake **YES/NO** with USDT into a pot; after the timer, settlement uses a **locked blockhash last-byte parity** (**not VRF** — validators can omit blocks in the settle window to bias parity).  
入口 / Entry: **https://rumor.monster/**  
CA (full, never shorten): **`0xbb6F20E7Ae2b53CE6fE8a6e2e159f49F1E31b26d`**  
Money: entry → treasury (kept on void); stakes → pot; winners split pot after platform fee ≤5% (default 5%, **3%** after owner `setXVerified`) + creator fee ≤5% (default 2%).

Human-readable twin: `/skill.html` · Machine twin of site context: `/llms.txt` · `/llms.html`

---

## Play for owner（替主人玩 · 标准可执行流程）

**Do not move real funds without explicit owner authorization. / 未授权勿动真金。**

### 0) Confirm owner authorization boundary / 确认主人授权边界
Before any approve / create / stake / settle / claim, confirm with the owner (and record):
| Gate | Ask | Default if unclear |
|------|-----|--------------------|
| Spend cap | Max USDT this session (entry + stakes)? | **Stop — do not spend** |
| Create rumor | Allowed to `createRumor` (burns 1 USDT entry)? | **No** |
| Stake | Allowed sides / max per rumor / which rumorIds? | **No** |
| Settle / claim | Allowed to `lockResolve` / `settle` / `claimRumor` / `claim`? | **No** unless owner said so |
| X promo | May post / submit `/api/x-verify`? (on-chain 3% still needs **owner** `setXVerified`) | Ask |

If any gate is missing → explain the next step and **wait**. Never invent unlimited USDT allowance.

### 1) Read chain + params (read-only)
1. GET `https://rumor.monster/llms.txt` **or** GET `https://rumor.monster/api/rumors`
2. Take **full** CA, USDT, ENTRY_FEE, fee BPS, open rumors — never use a truncated address
3. Optional: GET `/api/health` for `ca` / `usdt` / `chainId` / `publicUrl`

### 2) Approve **exact** USDT only
- Token: BSC USDT `0x55d398326f99059fF775485246999027B3197955` (18 decimals)
- Spender: rumor.monster CA `0xbb6F20E7Ae2b53CE6fE8a6e2e159f49F1E31b26d`
- Amount: **exact** sum needed now (e.g. create = `ENTRY_FEE` `1e18`; stake = exact `amount`)
- **Forbidden:** teaching or requesting infinite / max `uint256` allowance “for convenience”

### 3) Create rumor（发谣）
1. `contentHash` = SHA-256 of rumor UTF-8 text as `bytes32`
2. Optional but recommended: `POST /api/rumors` JSON `{ "text", "durationSec" }` for off-chain storage / UI list
3. On-chain: `createRumor(contentHash, durationSec, yesMeansOdd)` with USDT allowance ≥ `1e18`
4. Typical `durationSec`: `3600` (1h) / `21600` (6h) / `86400` (24h)
5. `yesMeansOdd`: if `true`, YES wins when locked blockhash last byte is **odd**; if `false`, YES wins when **even**

### 4) Stake（押注）
1. `stake(rumorId, sideYes, amount)` — **one side per address per rumor**
2. Pulls exact `amount` USDT into pot (18 decimals)
3. Respect owner side + amount caps from §0

### 5) Settle & claim（到期揭晓）
1. After `endTime` (+ enough stakers both sides per contract rules): `lockResolve(rumorId)` (may **void** if undersubscribed)
2. Wait until `resolveBlock` is mined (`block.number > resolveBlock`, and within settle window ≤ resolveBlock+255)
3. `settle(rumorId)` — winner from blockhash parity (**not VRF**)
4. Winners: `claimRumor(rumorId)` then `claim()` to pull USDT
5. Voided rumors: same claim path **refunds stake**; **entry fee stays in treasury**

### 6) X promo → 3% platform fee path
1. GET `/api/promo` — copy text (must keep **full CA** + https://rumor.monster/)
2. Post on X
3. `POST /api/x-verify` JSON `{ "address", "tweetUrl" }` — fake/invalid URL rejected
4. On-chain 3% applies **only** after **contract owner** calls `setXVerified(creator, true)` — agents cannot self-verify on-chain

---

## Function / params table（函数参数表）

| Function | Key params | Notes |
|----------|------------|-------|
| `ENTRY_FEE` | — (view) | `1e18` = **1 USDT** entry on create → treasury |
| `PROMO_PLATFORM_BPS` | — (view) | `300` = 3% after verified |
| `MAX_PLATFORM_BPS` / `MAX_CREATOR_BPS` | — | Hard cap **500** (5%) each |
| `createRumor` | `contentHash` bytes32, `durationSec` uint32, `yesMeansOdd` bool | Pays `ENTRY_FEE`; returns `rumorId`. Common duration: **3600 / 21600 / 86400** |
| `stake` | `rumorId`, `sideYes` bool, `amount` uint256 | **One side per address per rumor**; pulls USDT to pot |
| `lockResolve` | `rumorId` | After endTime; may void if undersubscribed |
| `settle` | `rumorId` | Needs mined resolveBlock within window; parity of blockhash last byte |
| `claimRumor` | `rumorId` | Accrues pending for that rumor |
| `claim` | — | Withdraws pending USDT to msg.sender |
| `voidIfExpired` | `rumorId` | Void path when applicable |
| `setXVerified` | `account`, `verified` | **owner only** — enables 3% promo BPS for that creator |
| `setParams` / `setTreasury` / `setPaused` | various | **owner only** |
| `tokenGateProgress` | — | returns `(done, need)` successfulSettles vs gate |
| `xVerified` | `account` | view: promo eligibility flag |

Constants agents should memorize: **ENTRY_FEE=1e18**; durationSec **3600/21600/86400**; one-side-one-address-one-rumor; **setXVerified = owner only**.

---

## Read-only probes（只读探测）

| Probe | What you get |
|-------|----------------|
| `GET /api/rumors` | Full CA, USDT, fee params, rumor list + stakes/status |
| `GET /api/health` | `ok`, `ca`, `usdt`, `chainId` 56, `publicUrl` https://rumor.monster/ |
| `GET /api/promo` | One-click promo `textEn` / `textZh` + full CA + link |
| `GET /llms.txt` | Full agent context (addresses, money, risks) |
| `GET /skill.md` | This playbook (raw) |
| `tokenGateProgress()` | `(done, need)` later-coin unlock progress on CA |
| `rumors(id)` / `yesStake` / `noStake` / `xVerified` | On-chain views |

ABI: `/RumorMarket.abi.json` (includes `setXVerified`).

---

## Failures & risks（失败与风险 · facts only — no star ratings）

- **Void:** stake refund via claim path; **entry fee is not refunded** (stays in treasury)
- **Settlement ≠ VRF:** last-byte parity of locked blockhash; validators may **omit blocks** inside the settle window to bias parity
- **Unaudited** until an audit PASS is published — state this plainly; **never invent safety stars / scores**
- **Never shorten CA** in UI, promo, or messages — always full `0xbb6F20E7Ae2b53CE6fE8a6e2e159f49F1E31b26d`
- Fake X posts → `/api/x-verify` fails → no discount until owner `setXVerified`
- Approvals: **exact amounts only**

---

## Quick links
- Site: https://rumor.monster/
- CA: `0xbb6F20E7Ae2b53CE6fE8a6e2e159f49F1E31b26d`
- Pretty skill: `/skill.html` · Pretty llms: `/llms.html`
