skills/okx-growth-competition/SKILL.md
List OKX Agentic Wallet exclusive trading competitions, register users for contests, track participation and leaderboard rankings, and claim won rewards. Use when users want to list available trading competitions or trading cups, view competition rules / prize pool / total prizes, register or sign up or enroll or join a contest, check the leaderboard (who is winning) or their own rank (am I in the prize zone, what is my place), ask did I win or query participation / claim status, claim won rewards or prizes from completed competitions, see which wallet account they registered with, or submit Telegram / WeChat / Email / Twitter contact for prize delivery to top-tier winners.
npx skillsauth add okx/onchainos-skills okx-growth-competitionInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Agentic Wallet exclusive trading competitions. Full lifecycle split across focused references:
references/participation.mdreferences/details.mdreferences/rank.mdreferences/claim.mdreferences/cli-reference.mdThis SKILL.md holds the global rules (facts, identity invariants, routing, output rules, time formatting, status codes, error handling) that ALL references depend on. Always read this file first; then jump into the matching reference for the user's intent.
Treat the following as factual ground truth when the user asks about how a competition works. The two chain-related fields play distinct, non-overlapping roles — never conflate them:
chainId — single id. The claim / reward chain ONLY (rewards are paid on this chain; its contract address lives here). It is NOT a trading chain unless it also appears in participateChainIds.participateChainIds — array of ids returned by both list and detail endpoints. The trading chain set. Trades on any chain in this list count toward the same competition standing.Trading-chain set = participateChainIds. Claim chain = chainId. These are two separate concepts; the display rules below NEVER union them.
1 → Ethereum, 196 → X Layer, 501 → Solana.participateChainIds.myRankInfo.userTotal = 0 means the user has not yet hit the qualifying threshold or the backend metric pipeline has not picked up their trades yet — it does NOT mean the user's chain is unsupported.competition_rank takes a single optional wallet. Omit it for self-rank — the tool sends your accountId (covers every chain in participateChainIds in one call; no chain pick). Pass an explicit address ONLY when querying someone else's rank; the address chain family (EVM 0x... else Solana) must match the activity's primary chain or the tool rejects the call (no silent wrong-chain queries).The query identity for competition_rank and competition_user_status is mutually exclusive: backend accepts EITHER accountId (self) OR walletAddress (cross-user) — never both. The answer to "which identity did you use?" is deterministic from the call shape.
| Call shape | Identity sent |
|---|---|
| competition_user_status (any) | accountId — covers every chain in participateChainIds in one call |
| competition_rank without wallet | accountId |
| competition_rank with wallet=<addr> | walletAddress — tool validates addr's chain family (EVM 0x... else Solana) matches activity's chainId; mismatch → rejected |
| competition_claim (pre-check) | accountId |
For multi-activity competition_user_status (no activity_name), the same accountId is reused across all activities — backend joins by accountId.
Before producing ANY user-facing message about a competition, you MUST first locate the matching section in the right reference file below and follow its fixed template structure. Do NOT improvise the format. Do NOT shorten the templates. Do NOT drop sections or merge them. Templates are product-mandated copy (Participation / Skill Quality wording, disclaimer) and must not be paraphrased.
The template structure is fixed; the language follows the user — see the ## Output Language rule below. When the user writes Chinese, translate the template strings to natural Chinese. When the user writes English, use English as written. Placeholders (including chain display names from {supportedChains}) stay as-is.
Quick router (user intent → reference file + section):
| User intent | Reference file | Section |
|---|---|---|
| "list competitions / show available competitions" | references/participation.md | Step 1 — Discover |
| "show details / show rules / show prize pool" | references/details.md | Step 2 — View Details |
| "register / join" | references/participation.md | Step 3 — Join |
| "trade for me" | references/participation.md | Step 4 — Trade (delegates to okx-agentic-wallet) |
| "leaderboard / full board / who is winning" | references/rank.md | Check leaderboard (full board) |
| "my rank / what's my ranking / am I in the prize zone" | references/rank.md | Check user's own rank (across ALL leaderboards) |
| "show registered wallet" | references/participation.md | Query Registered Wallet |
| "export wallet" | references/participation.md | Wallet Export Guard |
| "check my status / did I win" | references/claim.md | Check Participation Status |
| "claim reward / claim my prize" | references/claim.md | Step 6 — Claim Reward |
| Top-tier winner contact follow-up (needContact: true after claim) | references/claim.md | Contact collection (top-tier winners only) |
If the user's intent does not clearly map to one of the above, ask which they meant before responding — do not invent a freeform format.
Read
../okx-agentic-wallet/_shared/preflight.md. If missing, read_shared/preflight.md.
Cross-skill routing on common errors:
not logged in → walk the user through the okx-agentic-wallet login flow (run onchainos wallet login), then retry the original action.--status filter / status / joinStatus / rewardStatus) and error code messages (11002 / 11003 / 11008 / 1860402 / address limit reached / Sui-chain / region-blocked / not eligible): see references/cli-reference.md.All MCP tools mirror the CLI; MCP variants accept activity_name (server-resolves the id) and auto-resolve accountId / wallet addresses from the active session. Full flag tables and return shapes: references/cli-reference.md.
| # | Command | Auth | Description |
|---|---------|------|-------------|
| 1 | onchainos competition list [--status 0\|1\|2] [--page-size N] [--page-num N] | None | List competitions (default status=0, active only) |
| 2 | onchainos competition detail --activity-id <id> | None | Rules, prize pool, chain, timeline |
| 3 | onchainos competition rank --activity-id <id> [--wallet <addr>] --sort-type <type> [--limit N] | None | Leaderboard + user rank. See references/rank.md for self/cross-user semantics and sort-type discovery. |
| 4 | onchainos competition user-status [--activity-id <id>] | Wallet login | Participation & reward status (omit --activity-id for all activities) |
| 5 | onchainos competition join --activity-id <id> --evm-wallet <addr> --sol-wallet <addr> --chain-index <chain_id> | Wallet login | Register the active account for the competition |
| 6 | onchainos competition claim --activity-id <id> --evm-wallet <addr> --sol-wallet <addr> | Wallet login | Atomic claim — signs + broadcasts inside the call. See references/claim.md. |
| 7 | onchainos competition submit-contact --activity-id <id> --contact-type <Telegram\|WeChat\|Email\|Twitter> --contact-value <text> | Wallet login | Record contact for a top-tier winner; only after a claim with needContact: true. See references/claim.md. |
--status (request filter): 0=active, 1=ended, 2=all
activityStatus (response field): 3=active, 4=ended — different from the request filter
Internal-only IDs vs user-facing display. Internal numeric IDs (
activityId,chainIndex,accountId) are returned in tool responses on purpose — they are needed to chain calls between tools (e.g. aftercompetition_join, you may need to callcompetition_detailwith the activity id to fill the success template). Keep them in the data layer; never render them in user-visible messages.
Never include any internal id in a message produced for the user — under ANY circumstance, in ANY format. Identify activities to the user EXCLUSIVELY by activityName (or shortName if name is unavailable).
Forbidden user-visible patterns (do NOT produce output like this):
Agentic Trading Contest (#107)#106 (agenticwallettest1)competition 107, an ID column, a labeled Activity ID row) — same rule, regardless of label, shape, or language.Correct user-visible pattern:
Agentic Trading ContestchainName (e.g. Agentic Trading Contest (Solana)), never the ID.Behind the scenes (allowed and expected):
activityId from a competition_user_status / competition_join response and passing it to competition_detail to fetch the data needed by a fixed template.When the user asks to act on a specific activity (e.g. "claim Agentic Trading Contest"), the MCP tools competition_claim / competition_join accept activity_name and resolve the id server-side, so you can also use names directly without doing your own lookup.
Render every fixed template in the user's conversation language. The template structure (sections, ordering, numbered items, table column count, placeholder positions, the {supportedChains} placeholder, and the [Disclaimer: ...] block) is fixed and must NOT change. Only the natural-language text inside is translated to the user's language naturally.
Placeholders are never translated. {supportedChains}, {chainName}, {rewardUnit}, {txHash}, {accountName}, etc. are filled with API values verbatim — do not localize them. Chain display names (e.g. Solana, X Layer, Base) come from the canonical id → name mapping and stay as-is in every language.
Final check before sending — covers the reference-file MUSTs that are easy to skip after a long response. (Rules already covered in earlier sections — internal IDs, participateChainIds, *Formatted, language/template fidelity — are not repeated here; verify them by following the rules at their home sections.)
[Disclaimer: Digital asset trading involves risk. ...] line is present on its own line at the end. (→ participation.md → Successful registration)claim.md → Fixed failure-suggestion block)competition_claim → the pre-claim preview line (You are about to claim {rewardAmount} {rewardUnit} on {chainName}. Reply "confirm" to proceed.) was rendered and the user replied with an explicit confirmation. (→ claim.md → Pre-claim preview)tools
OKX.AI Trading Hackathon (交易黑客松 / OKX.AI 交易黑客松 / 报名黑客松 / 黑客马拉松) registration. Use when the user wants to register for / sign up for / enter / join / 报名 / 参加 / 参赛 the OKX.AI trading hackathon — e.g. 'Register me for the OKX.AI Trading Hackathon', '我要参加黑客松', '帮我报名 OKX.AI 的交易黑客松' — or asks about its entry requirements / eligibility / 报名条件 / 参赛资格 / how to enter. The object is always the hackathon itself: it enters a Trading ASP the user already has and never creates one. Each activity carries its own flow, gates, and CLI reference under this skill's references/, picked by the Intent Routing table.
tools
HARD BLOCK — never use for prediction-market/Polymarket UpDown queries; route to okx-dapp-discovery when a named DApp (Polymarket/Aave/Hyperliquid/PancakeSwap/Morpho) appears with a timeframe, or 涨跌/updown for BTC/ETH/SOL/XRP/BNB/DOGE/HYPE. Otherwise, read-only on-chain DEX data, 6 groups: TOKEN (search, hot/热门, liquidity, holders/whale, risk metadata, cluster/持仓集中度, trade history, top traders); MARKET (price/价格, K线/OHLC, index price, wallet PnL/胜率, trade history); SIGNAL (smart money/KOL/whale tracking, buy signals/信号, leaderboard/牛人榜); SOCIAL (news/新闻, sentiment/情绪, token vibe/热度, KOL leaderboard); TRENCHES (pump.fun/meme launches/新盘/扫链, dev reputation, bundle/sniper detection/捆绑狙击者, co-investor — read-only; buy/snipe → okx-dapp-discovery); WS (onchainos ws CLI, or custom WebSocket script/脚本). Also owns Market API payment/x402, quota/额度, and MARKET_API_*_OVER_QUOTA/confirming:true for all 6 groups.
testing
监听任务进展 / 帮我盯着任务 / 任务有动静告诉我 / 历史消息 / 未读消息 / 未决策 / 待决策 / 继续监听 / task watch / user watch / monitor task progress / catch me up on tasks / outstanding decisions — OKX A2A user-session task-notification monitor: live long-poll via `okx-a2a user watch` (also drains backlog of past/missed/unread events on entry) plus un-replied decision_request lister via `okx-a2a user outdated-list`. Not for wallet / gas / task-list / status queries.
testing
MUST ACTIVATE on inbound envelopes: (1) {agentId, message:{source:"system", event, jobId, ...}} — system event; (2) {msgType:"a2a-agent-chat", jobId, sender:{role}, ...} — agent-to-agent task chat (fields at top level; sender.role = COUNTERPARTY, not you); (3) literal "Read okx-agent-task/SKILL.md" in envelope. ALSO activate for keywords: 发布任务 / 创建任务 / 帮我发任务 / publish task / create task / 接任务 / 接单 / 协商 / 验收 / 拒绝 / 仲裁 / dispute / stake / unstake / 修改卖家 / 修改预算 / change provider / change budget / 草稿 / draft / 保存草稿 / 搜索任务 / 所有任务 / 查找任务 / browse marketplace / search marketplace / 我的任务 / my tasks / what am I working on / 关闭任务 / close task / 取消任务 / 决策列表 / decision list / 查看决策 / hire agent / 指定服务商 / 开始任务.