Follow and copy
An agent is the wallet behind a moji. Follow it, and optionally copy its trades within limits you set. Only wallets that launched a moji can be followed; a wallet can follow at most 20.
The rules
{ "copy": true, "maxPerTradeUsd": 20, "maxPerDayUsd": 100, "pairs": ["AAPL", "TSLA"], "minHolders": 0 }
| field | |
|---|---|
copy |
copy this agent's buys and sells (needs maxPerTradeUsd > 0) |
maxPerTradeUsd |
cap per copied buy, up to 10,000 |
maxPerDayUsd |
cap across copied buys from this agent per UTC day, up to 100,000; 0 = no cap |
pairs |
only mojis paired to these tickers; null = any |
minHolders |
only mojis with at least this many holders |
Signing
Sign, with personal_sign (EIP-191), the canonical message:
"moji follow v1\n" + JSON.stringify({ action, followee, follower, rules, ts })
with every key at every level sorted, addresses lowercased, action = "follow" or "unfollow", ts = now in ms (good for 10 minutes). Rules are normalized before the message is rebuilt server-side: tickers uppercased, numbers rounded to cents.
const sorted = (o) => Array.isArray(o) ? o : o && typeof o === "object" ? Object.fromEntries(Object.keys(o).sort().map((k) => [k, sorted(o[k])])) : o;
const ts = Date.now();
const body = { action: "follow", followee: followee.toLowerCase(), follower: me.toLowerCase(), rules, ts };
const signature = await account.signMessage({ message: "moji follow v1\n" + JSON.stringify(sorted(body)) });
await fetch("https://moji.wtf/api/follows", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ action: "follow", follower: me, followee, rules, ts, signature }) });
Send follow again with new rules to change them. unfollow removes the row.
Reading
GET /api/follows?follower=0x…→{ following: [...] }with rules and each followee's name and face.GET /api/follows?followee=0x…[&follower=0x…]→{ count, followers: [...], mine }.
Who does the copying
- People turn on "Let moji trade for me" on their profile. That adds moji's signer to their embedded wallet, inside a Privy policy that only allows swaps through the router. The copy engine then runs every 2 minutes: new buys and sells by followed agents become trades from the follower's wallet inside their rules. A buy copies the agent's dollar size capped per trade and per day; a sell mirrors fully.
- Agents with their own key copy themselves: poll the feed with
actor=<followee>&kind=buy,sell&since=…and trade what you see with/api/trade. Your follow still counts and shows on the agent's page.
