尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Contributor guild on Monad: passport, open work, and a record of reviewed contributions.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Most NFT utility is a badge or a discount. Take the NFT away and the product still works. Choguild turns that around: a wallet is just a key, and the member is the Chog.
chog:<tokenId>, never a wallet address.ownerOf on Monad mainnet) acts as it, and every write re-checks it./chog/:id.With no Chog, a wallet can sign in and browse, but it cannot save a passport, post a listing, apply, review work, do quests or appear on the leaderboard. There is no wallet-level account to fall back on, so if you removed the NFT, Choguild would have no members at all.
| Chog passport | Name, bio, skills and links, saved on the token. Its face is always the Chog's own art. |
| Chog-to-Chog work | Chogs post listings with terms, a deadline, positions and skills. Other Chogs apply and submit evidence. The poster's Chog accepts it, asks for changes, or rejects it. |
| Leaderboard of Chogs | /ranking ranks tokens, not people, both all-time and for the current season. |
| Evolving card | The card's frame, title and glow change with tier: Hatchling → Apprentice → Artisan → Guildmaster → Legend. |
| $CHOG tips | From any Chog's page, tip its current holder in $CHOG. This is a direct ERC-20 transfer from your wallet, with no escrow. The address comes from chog.xyz and was checked onchain (name "Chog", symbol "CHOG", 18 decimals). |
/chog/:id and a shareable /duel/:id result page.Transfer(publisher → holder, amount ≥ reward) from the $CHOG contract. Each Chog page shows its total rewards paid.SEASON_PRIZE)./passport → Check in → save its passport → duel a rival Chog from its page → open a listing → share the rank card.Without a Chog, the same wallet stays view-only, which is the point.
| Action | XP |
|---|---|
| Accepted submission | +100 |
| Accepted application | +25 |
| Published listing (counts once another Chog's work is accepted on it, or it stays open 72 h; max 4 per 30 days) | +15 |
| Saved public passport | +10, once |
| Daily check-in | +5, plus +1 per streak day (bonus max +10) |
| Scout a listing, visit a rival | +5 each, once a day |
| Duel (challenger) | win +6 · draw +3 · loss +1 |
| Duel (defender holds) | +3 |
The farming rules live in src/lib/ranking/farming.ts, src/lib/chog/actor.server.ts and src/lib/quests:
src/lib/duels).orphaned_at, migrations/0013_orphan_listings.sql).Tiers start at Hatchling 0 · Apprentice 50 · Artisan 150 · Guildmaster 400 · Legend 1000.
Migration from v2: passports that used to be tied to a wallet moved, with their history, onto that wallet's lowest-numbered Chog (based on the last saved list of holders). Passports from wallets with no Chog were archived. If such a wallet later acts as a Chog that has no passport yet, its old record moves onto that Chog (migrations/0010_chog_is_member.sql).
flowchart LR
W[Browser wallet] -->|SIWE, no gas| S[Session: wallet + acting Chog]
S -->|every write| O{ownerOf Chog #id<br/>== wallet?}
O -->|no| V[View only / Chog dropped]
O -->|yes| A[Actor chog:id]
A --> P[(Postgres: passports, listings,<br/>applications, submissions, quests)]
P --> X[XP engine<br/>anti-farming + seasons]
X --> L[Leaderboard · /chog/:id · rank card]
M[Monad mainnet] -->|ownerOf, holder list via Multicall3| O
Browser (React 19, wagmi injected connector)
│ server functions (zod-validated, rate-limited)
▼
TanStack Start on Vercel (Nitro) ──► Postgres (Neon) / PGLite locally
│
└─► Chog Genesis 0xc96d…3763: live ownerOf before every write (30 s cache for reads),
wallet → Chogs holder list via Multicall3 (5 min cache)
src/
routes/ /, chog/$chogId, ranking, passport, discover, opportunities, applications, submissions, docs, api
components/chog/ chog card, act-as picker, quests, level-up + confetti, rank card, $CHOG tip
lib/chog/ actor keys (chog:<id>), live ownerOf, holder list, legacy adoption
lib/quests/ daily quests, streaks, weekly seasons
lib/ranking/ XP rules, anti-farming, tiers, leaderboard
lib/board/ listings and applications
lib/work/ submissions and reviews
lib/passport/ profiles, SIWE sessions, wallet config
migrations/ SQL schema, applied in order (0010 = Chog is the member)
docs/screens/ README screenshots
cmdk, lucide-react; own design system with neutrals and one solid purple (#836EF9), plus light/darkwagmi (injected connector only) + viem on Monad mainnet (chain 143); Sign-In with Ethereum sessionspg (Neon in production), in-memory PGLite locallyzod on every server function, per-client rate limits, enforced CSPRequires Node 22 (.nvmrc).
npm install
npm run dev # http://localhost:8080
No database is needed locally: PGLite starts in memory and applies migrations/ on boot.
| Variable | Required | Purpose |
|---|---|---|
DATABASE_URL | For persistent data | Postgres connection string (Neon works). Without it data lives in memory. |
CHOG_SESSION_SECRET | Yes, on deployed builds | ≥32 random characters (openssl rand -hex 32). Signs passport sessions. |
VITE_MONAD_RPC_URL | No | Preferred Monad RPC (https). Add a custom host to connect-src in vercel.json. |
CHOG_RUN_MIGRATIONS | No | Local/CI: 1 lets npm run db:migrate run outside Vercel. |
On Vercel, migrations run during npm run build only for production deploys with DATABASE_URL set.
npm run typecheck
npm run lint
npm test # script + unit tests (ranking, farming, quests, seasons, board, passport, chog)
npm run test:chog-live # live Chog Genesis ownership checks against Monad mainnet
npm run build
CI (.github/workflows/ci.yml) runs typecheck, lint, tests and build on Node 22 for every push and pull request.
Injected browser wallets only (MetaMask, Rabby…). No Coinbase SDK, no WalletConnect, no Phantom. On a phone with no injected wallet, tapping Connect wallet offers deep links that reopen the page inside a wallet app.
Enforced CSP and security headers in vercel.json (violations reported to /api/csp-report), zod-validated inputs, per-client rate limits, client errors logged via /api/client-error, no source maps shipped.
Judges: start with JUDGES.md (tours, onchain checks, known limitations)
Live app: https://choguild.vercel.app
Docs / whitepaper: https://choguild.vercel.app/docs
Chog Genesis: https://monadscan.com/token/0xc96d31F8626c6D03Fae5dCD3d61e3FB9F4a73763
$CHOG: https://monadscan.com/token/0x350035555E10d9AfAF1566AaebfCeD5BA6C27777