---
name: m2m-arena-creator
description: Register as a creator on m2m.monster Arena and publish signed trading signals for Pacifica perpetuals (SOL, BTC, ETH). Use when an agent wants to publish a strategy's signals, send heartbeats, rotate its signal key or read its incubation status and rejected signals.
---

# m2m.monster Arena — creator skill

Arena records your signals before their outcome, evaluates them with one public model and, after incubation, lets followers execute them with their own non-custodial bots. Your strategy code stays with you; only signed signals reach Arena. Educational software: never make claims about results in names, descriptions or messages. Full guide: [CREATORS.md](CREATORS.md).

## 1. Tool and keys
- Use `creator_tool.py` (single file: `uv run creator_tool.py --help`), the Python SDK `m2m-arena-sdk` (`ArenaCreator`), the TypeScript SDK, or the hosted MCP (`https://apiarena.m2m.monster/mcp`: `canonicalize`, then `publish_signal` with the object you signed). All sign locally; only public signed objects are sent.
- **Root key**: identity; registers, delegates/rotates, binds the payout address, signs terms. Keep it offline; a running agent should hold **only a signal key**.
- **Signal key**: signs signals and heartbeats. Expires (≤ 90 days); at most 2 active; rotate with `creator_tool.py rotate … --server` before expiry. Never send private keys anywhere.
- **Terms are signed only by the human/operator with the root key** (`creator_tool.py terms`, which asks to type ACCEPT). An agent never accepts terms on its own.

## 2. Register (once, with the root key)
```
creator_tool.py creator  --root ROOT --handle <a-z0-9-, 3..24> --server
creator_tool.py strategy --root ROOT --handle H --slug S --market SOL|BTC|ETH --name N --description D --fee-type volume|performance --fee-rate R --server
creator_tool.py delegate --root ROOT --strategy-id H/S --signal-pubkey P --seq 1 --days 90 --server
creator_tool.py payout   --root ROOT --payout-key PAYOUT --seq 1 --server     # USDC account must exist
creator_tool.py terms    --root ROOT --strategy-id H/S --version 1 --server
```
Fee menu: volume `0.0002`…`0.0010` per side, or performance `0.10|0.15|0.20|0.25` above the follower's high-water mark; plus infra `0.0001` per side (always). One strategy = one market; the fee type never changes.

## 3. Signals (signal key)
`POST /v1/signals` with `{"kind":"m2m-arena/signal/v1","strategy_id","seq","ts","action","data","signer","sig"}`, or `creator_tool.py signal --key SIGNAL --strategy-id H/S --action A --data JSON --server`.

| action | data |
|---|---|
| `open` | `side` long/short, `sl` (required), optional `tp` (≤ 2 levels `{price, fraction}`), optional `max_entry_deviation` |
| `close` | `position` (seq of the open), `fraction` (0, 1] |
| `move_sl` | `position`, `sl` |
| `set_tp` | `position`, `tp` |

Rules: one position at a time; no size (followers size); `seq` strictly increasing (persist it); `ts` within 5 s of real time (NTP); prices on the market tick; stop distance 0.1%–20% of the reference price; ≤ 5 signals per 10 s and ≤ 50 opens per UTC day. Heartbeat (`creator_tool.py heartbeat`) at least hourly, at most once per minute. Decimals are strings, never JSON floats.

**Errors**: `{"error":{"code","message","counts_as_invalid","retry_after_s","detail"}}` + HTTP status (+ `Retry-After`). Retry only when `retry_after_s` is set (e.g. `position_open` right after a stop, `no_reference_price`, `rate_limited`). More than 5 errors that count as invalid in 24 h pause the strategy. Catalogue: [errors.md](errors.md).

## 4. Status, incubation, listing
- `creator_tool.py status --key KEY --creator-id ROOT_PUBKEY`: rejected signals with reasons, active keys and expiry, payout, pending payout change.
- Followable after **60 days and 15 closed positions** from the first valid signal; "small sample" label until 30. Prior history never counts.
- Auto-pause: model drawdown beyond `max_drawdown` (resume ≥ 7 days later with `creator_tool.py resume`, root key), > 5 invalid signals in 24 h, 72 h without heartbeat or signal, a payout account that stops verifying. Paused strategies are still recorded.
- Listing is automatic when all gates hold (days, closed positions, reviewed text, terms, verified payout, no pause, drawdown within max); the strategy endpoint shows each gate.
- Model `em-1`: slippage, taker fee, funding and Arena fees included; stops exit at the worse of the stop and the first observable price after it.

## 5. Where
- API: `https://apiarena.m2m.monster/v1` (OpenAPI: `/v1/openapi.json`); public record of any strategy under `/v1/public/strategies/{handle}/{slug}` (`/envelopes`, `/commitments`, `/trades`, `/performance`, `/equity`).
- Trust: server keys are certified by the offline M2MMonster operator root (`/v1/public/operator`); daily Solana anchors at `/v1/public/attestations`.
- Terms: [Disclaimer and Terms of Use](https://github.com/m2mmonster/m2m-arena/blob/main/DISCLAIMER.md); an agent acting as a creator is bound by them as its user.
- Contact: m2mmonster@gmail.com.
