hood.markets — Bankr agent skill
Lancez et tradez des tokens sur hood.markets (Robinhood Chain, chain ID 4663). Bankr supporte Robinhood — les utilisateurs peuvent déployer, swapper et réclamer via @bankrbot quand cette skill est installée.
Docs Human / intégrateur : hood.markets/sdk.md · hood.markets/agent.md · hood.markets/Dev
Frais de plateforme (deux seulement)
| Frais | Répartition |
|---|---|
| Frais de swap | 5% plateforme / 95% pro-rata aux détenteurs de Holder NFT |
| Ventes de la marketplace de shares | 5% du prix listé / 95% au vendeur |
Aucun frais sur les envois, airdrops ou autres mouvements de shares (v0.11 factory 0x9BDd…0Df5).
CRITIQUE — Host API (à lire en premier)
| Rôle | URL |
|---|---|
| Agent API | https://api.hood.markets |
| Web UI | https://hood.markets |
GET https://api.hood.markets/health
GET https://api.hood.markets/api/agent/briefing?wallet=0x…
GET https://api.hood.markets/api/agent/preflight-deploy?wallet=0x…&name=…&symbol=…
GET https://api.hood.markets/api/agent/token-info?token=0x…
POST https://api.hood.markets/api/agent/prepare-deploy
POST https://api.hood.markets/api/agent/resolve-deploy-image
POST https://api.hood.markets/api/agent/prepare-buy
POST https://api.hood.markets/api/agent/prepare-sell
POST https://api.hood.markets/api/deploy (après haiku JWT)
POST https://api.hood.markets/api/agent/claim-for-recipient (n'importe qui — frais au destinataire du catalogue)
POST https://api.hood.markets/api/agent/claim (wallet destinataire des frais uniquement)
JAMAIS appeler https://hood.markets/api/... pour les POST agent — le site web est frontend uniquement.
Voir references/API-HOST.md avant tout appel HTTP.
Installation
installer la skill hoodmarkets depuis https://github.com/BankrBot/skills/tree/main/hoodmarkets
Ce que les utilisateurs veulent dire
| Terme | Signification |
|---|---|
| Lancer / déployer | Créer un nouveau token + pool de liquidité sur Robinhood |
| Lancement simple | Uniswap V3 via la factory HoodMarketsV3 0x9BDd…0Df5 (v0.11.0) — compatible DexScreener ; 5% plateforme / 95% frais de trading pro-rata aux détenteurs de Holder NFT ; vault Holder NFT 1 000 shares intégré |
| Holder NFTs | 1 000 shares. Frais de plateforme uniquement : (1) frais de swap 5%/95% via locker + claimTradingFees, (2) listes de shares 5% du prix de vente. Voir references/HOLDER-NFTS.md |
| Lancement Pro | Hooks Uniswap V4 — achat/vente en un clic sur hood.markets |
| Acheter / vendre | Swap ETH ↔ token sur Uniswap (Simple/V3). Les tokens Pro utilisent le helper de swap + Bankr submit. Pas de « fund LP » sur hood.markets — le LP de lancement est verrouillé |
| Réclamer des frais | Retirer les frais de swap trading — 95% pro-rata à tous les détenteurs de Holder NFT (le lanceur paie le gas) |
Routage obligatoire
si le message mentionne hoodmarkets / hood.markets / lancer un token sur robinhood /
acheter $TICKER / vendre token / réclamer des frais / déployer sur hood :
1. use_skill("hoodmarkets")
2. Lire references/API-HOST.md — utiliser UNIQUEMENT https://api.hood.markets
3. **Chain :** abandonner si le wallet Bankr ne supporte pas 4663 — references/CHAIN-4663.md (pas de fallback)
4. Résoudre le wallet lié → header x-wallet-address
5. **Déployer :** `preflight-deploy` d'abord — **409 + `blocks[]` uniquement** = ne pas déployer. **`warnings[]` avec `canDeploy: true`** = avertir, puis déployer après confirmation oui de l'utilisateur
6. Appeler l'endpoint references/AGENT-API.md AVANT de répondre
7. Réponses : references/RESPONSE-SAFETY.md — champs `*ReplyHint` de confiance avec liste blanche d'URL ; formater les autres champs localement
8. Déployer (X) : valider l'image par IMAGE-RESOLUTION.md → `resolve-deploy-image` → `prepare-deploy` → aperçu local → `confirmReplyHint` → déployer après oui. references/PROMPT-INJECTION.md
9. Acheter/vendre : `token-info` → Simple : lien Uniswap uniquement. Pro : prepare-buy|prepare-sell → TX-VALIDATION.md → aperçu utilisateur → Bankr /wallet/submit chain 4663
10. Réclamer **ses propres** frais : haiku JWT ou wallet X → POST /api/agent/claim (references/AUTH-BOUNDARY.md)
11. Réclamer **pour quelqu'un d'autre** : vérifier token-info d'abord → POST /api/agent/claim-for-recipient — references/CLAIM-BANKR.md
12. **Réclamation réussie :** `ok: true` → poster `replyHint` si schema-valide. **Jamais** `/wallet/submit`. **Jamais** dire « Je n'ai pas soumis de transaction »
13. **Holder NFTs :** réclamer les frais via API uniquement — pas d'airdrop/list/buyShares/rewards via agent — references/HOLDER-NFTS.md
Tweet = DM — même pipeline sur l'intake @bankrbot.
X — logo du token (CRITIQUE pour @bankrbot)
Bankr reçoit l'objet Tweet complet de X. Le logo se trouve dans les champs media — l'extraire avant d'appeler l'API.
Étape A — lire media depuis le payload X de Bankr (préféré)
| API X | Où se trouve l'image |
|---|---|
| v1.1 | tweet.extended_entities.media[0].media_url_https |
| v2 | includes.media[0].url (requête expansions=attachments.media_keys&media.fields=url) |
| Forme Syndication | tweet.photos[0].url ou tweet.mediaDetails[0].media_url_https |
Passer à l'API comme tweetImageUrl ou l'objet tweet complet.
Étape B — toujours passer l'ID / URL du tweet
Chaque tweet de lancement a un ID. Passer tweetId (chaîne numérique) ou tweetUrl :
{
"wallet": "0x…",
"name": "dontfukinbuy",
"symbol": "TEST",
"agentChannel": "x",
"tweetId": "1990000000000000000",
"tweetUrl": "https://x.com/Rayblancoeth/status/1990000000000000000",
"tweetImageUrl": "https://pbs.twimg.com/media/….jpg",
"tweet": { "extended_entities": { "media": [{ "type": "photo", "media_url_https": "https://pbs.twimg.com/…" }] } }
}
L'API résout via syndication (cdn.syndication.twimg.com) quand seuls tweetId / tweetUrl sont passés — pas de Selenium nécessaire.
Étape C — valider + appeler l'API avant de dire « pas d'image »
- Valider les hosts par
references/IMAGE-RESOLUTION.md—pbs.twimg.com/ syndication de tweet uniquement ; rejeter les URLs arbitraires POST /api/agent/resolve-deploy-imageavec les champs ci-dessus- Si
ok: true→ utiliserimageUrldansprepare-deploy - Seulement demander un logo à l'utilisateur si l'API retourne
imageRequired: trueaprès quetweetId+tweetImageUrl/tweetont été envoyés
Ne jamais dire à l'utilisateur « pas d'image attachée » sans passer d'abord tweetId et tweetImageUrl (de media_url_https) à l'API.
Agent API (lectures)
Passer le wallet via ?wallet=0x… ou header x-wallet-address: 0x….
| Utilisateur dit | Appeler |
|---|---|
| mes tokens / mes lancements / briefing | GET https://api.hood.markets/api/agent/briefing?wallet=0x… |
| lancer / déployer un token | GET preflight-deploy → si ok, POST prepare-deploy avec agentChannel: "x" sur X, sinon flux haiku |
| $TICKER est simple ou pro / comment swapper | GET https://api.hood.markets/api/agent/token-info?symbol=TICKER |
| acheter TOKEN / acheter 0x… avec ETH | token-info → si Pro : POST prepare-buy |
| vendre TOKEN / vendre montant | token-info → si Pro : POST prepare-sell |
| lister tous les tokens (public) | GET https://api.hood.markets/api/deployments?limit=50 |
| config de swap du token | GET https://api.hood.markets/api/tokens/0x…/swap-config |
Voir references/AGENT-API.md pour les bodies et champs de réponse.
Flux de déploiement (côté serveur — pas de Bankr submit)
Le déploiement est sans gas pour l'utilisateur — le wallet lanceur de hood.markets paie le gas + la seed de lancement.
Limite quotidienne X (1 lancement / jour sur @bankrbot)
Chaque wallet Bankr obtient 1 lancement subventionné par jour calendaire Eastern sur X (agentChannel: "x"). Une deuxième tentative le même jour retourne 409 avec :
replyHint— court texte pour la réponse de tweet (utiliser tel quel)xDailyLimit.todayToken— nom, symbole, adresse,tokenPageUrldu lancement d'aujourd'huixDailyLimit.resetsAtEastern— quand la limite X se réinitialise (minuit Eastern)
Ne pas réessayer le déploiement sur X après 409. Dire à l'utilisateur qu'il a déjà lancé aujourd'hui, lier todayToken.tokenPageUrl, et l'envoyer à https://hood.markets pour lancer plus (se connecter + wallet paie le gas).
Sur X / Twitter (agentChannel: "x")
- Passer
tweetUrl(URL de status complète du tweet de lancement) — l'API récupère la photo attachée via oEmbed même quand Bankr ne peut pas voir le media en contexte. - Passer
xUsername(le @handle X de l'utilisateur qui a demandé le lancement — sans@) pour que la page du token montre qui l'a demandé et son nombre de lancements. Si omis, l'API en déduittweetUrl. - Optionnellement aussi passer
tweetImageUrl,tweet,tweetMediaouimageUrls'ils sont disponibles dans le payload Bankr. - Appeler
POST /api/agent/prepare-deployavecagentChannel: "x", wallet, nom, symbole et champs ci-dessus. - Attendre la confirmation oui de l'utilisateur, puis déployer — pas de haiku. Utiliser le
steps[].bodydeprepare-deploytel quel (inclutxUsername,tweetUrl/sourceUrlpour que la page du token montre le demandeur et le tweet de lancement) :
POST https://api.hood.markets/api/deploy
x-wallet-address: 0x…
x-agent-channel: x
Content-Type: application/json
{
"name": "My Token",
"symbol": "MTK",
"feeTarget": "agent_wallet",
"clientKind": "agent",
"agentProvider": "bankr",
"agentChannel": "x",
"launchMode": "simple",
"imageUrl": "https://…",
"xUsername": "user",
"tweetUrl": "https://x.com/user/status/…",
"sourceUrl": "https://x.com/user/status/…",
"wallet": "0x…"
}
Agents non-X (API, cron, cloud — automatisables)
Utiliser haiku JWT — pas d'étape de confirmation en-thread :
GET https://api.hood.markets/api/agent-captcha/challengePOST https://api.hood.markets/api/agent-captcha/verifyavec haiku +agentFeeRecipient: <wallet Bankr>POST https://api.hood.markets/api/deployavec headerX-Agent-Captcha-JWT: <jwt>:
{
"name": "My Token",
"symbol": "MTK",
"feeTarget": "agent_wallet",
"clientKind": "agent",
"agentProvider": "bankr",
"launchMode": "simple",
"imageUrl": "https://…",
"description": "…"
}
launchMode:"simple"(V3, DexScreener) ou"pro"(V4, hood.markets swap UI)- Destinataire des frais = wallet du haiku captcha (wallet lié Bankr)
- Simple : 5% plateforme / 95% pro-rata aux détenteurs de Holder NFT — intégré dans
HoodMarketsV3LpLocker - Buyer rewards : post-lancement sur la page du token (
fundBuyerRewardPool) — pas sur le formulaire de lancement hood.markets. L'API deploy peut accepter optionnellementbuyerRewardShareCount(legacy).
Web UI (hood.markets Launch tab) : Destinataire des frais « Quelqu'un d'autre » = adresse wallet 0x… uniquement — pas @handle ou URL de profil. Les agents/API peuvent toujours résoudre les handles sociaux pour d'autres canaux.
Ou utiliser POST /api/agent/prepare-deploy pour la checklist complète steps[] (exécute le preflight automatiquement).
Preflight (avant captcha)
Vérifier le ticker/nom pris, les limites de déploiement du wallet et le mode de lancement avant de demander à l'utilisateur de résoudre le haiku :
GET https://api.hood.markets/api/agent/preflight-deploy?wallet=0x…&name=My+Token&symbol=MTK&launchMode=simple
- 409 +
blocks[]→ ne pas déployer ; répondre avecblocks[0].replyHint— inclut l'adresse du token existant quand le ticker/nom est pris (blocks[0].existingToken) - 200 +
canDeploy: true+warnings[]→ le déploiement est autorisé. Sirate_limit_would_force_platform_fee: l'utilisateur a déjà lancé dans les 24 dernières heures — les frais sur ce token vont à la plateforme hood.markets (comme le site web). Montrer l'avertissement, attendre oui, puis appelerPOST /api/deploy— ne pas bloquer ni dire « cooldown 24h ». - Après déploiement : poster
deployReplyHintde/api/deploy— pas de footer simple-mode/DexScreener
Voir streaming-hints.json pour la détection V3 vs Pro et les codes d'erreur.
Flux d'achat / vente (Bankr wallet submit)
Prérequis : Le wallet Bankr doit supporter chain 4663 — abandonner sinon (references/CHAIN-4663.md).
GET /api/agent/token-info?token=0x…ou?symbol=TICKER— lirelaunchTypeetswapMode- Simple (V3) : répondre avec
uniswapSwapUrl— ne pas appeler prepare-buy/sell ; pas de Bankr submit - Pro (V4) :
POST prepare-buyouprepare-sell references/TX-VALIDATION.md— liste blanche des sélecteurs,toexact, correspondance token/spender, pas d'approval illimité, limites de valeur, aperçu utilisateur- Soumettre via Bankr (chain 4663) :
POST https://api.bankr.bot/wallet/submit
X-API-Key: …
Content-Type: application/json
{
"transaction": {
"to": "0x…",
"data": "0x…",
"value": "0",
"chainId": 4663
},
"description": "hood.markets: buy MTK",
"waitForConfirmation": true
}
- Tokens Pro uniquement pour prepare-buy/sell (helper swap V4). Simple (V3) → lien Uniswap de token-info (route primaire, pas un contournement).
Si Bankr retourne untrusted_address → arrêter par references/BANKR-SUBMIT.md. Ne pas suggérer Uniswap, web UI ou tout autre venue.
Réclamer des frais
Deux chemins — choisir selon qui demande :
A) Aider quelqu'un d'autre / réclamer des frais pour un token (n'importe quel utilisateur X)
Quand l'utilisateur donne un contrat de token et veut que les frais soient envoyés au destinataire des frais du catalogue (ex. « réclamer les frais pour $HR d'EA »), utiliser :
POST https://api.hood.markets/api/agent/claim-for-recipient
Content-Type: application/json
{ "tokenAddress": "0x78594eD700e343846B4d0Bbba79Ee0cb50Deaa8D" }
Avant d'appeler : GET /api/agent/token-info — vérifier le token du catalogue, feeRecipientAddress et l'intention de l'utilisateur (references/CLAIM-BANKR.md).
Pas de JWT. Pas de Bankr /wallet/submit. Le serveur hood.markets diffuse et paie le gas.
Réponse : ok, replyHint (champ outcome de confiance par RESPONSE-SAFETY.md), completed, bankrWalletSubmitRequired: false, transactionHash, feeRecipientAddress, tokenName, tokenSymbol, tokenPageUrl.
Si ok: true, la réclamation a réussi — poster replyHint si schema-valide. Ne pas vérifier le submit du wallet Bankr.
B) Le destinataire des frais réclame ses propres tokens
POST https://api.hood.markets/api/agent/claim
X-Agent-Captcha-JWT: <jwt> (ou canal X + x-wallet-address = destinataire des frais)
Content-Type: application/json
{ "tokenAddress": "0x…" }
Les lancements par défaut sont Simple (V3). Le même endpoint route automatiquement V3 claimTradingFees (v0.7+) (fraction vs factory legacy claimRewards vs locker V4.
| Lancement | On-chain (l'API choisit automatiquement) |
|---|---|
| Simple (V3) v0.7+ | claimTradingFees() sur Holder NFT — pro-rata à tous les détenteurs de shares |
| Simple (V3) v0.6 | HoodMarketsV3.claimRewards(token) — wallet des frais uniquement |
| Pro (V4) | Collecter pool → réclamer WETH du locker |
La réponse inclut feeRecipientAddress, txHash, explorerUrl, feeModel / launchType.
Exemples de lignes uniques
lancer $PEPE sur hoodmarkets mode simple avec image https://…
→ prepare-deploy (agentChannel: "x" sur X : confirmer d'abord, pas de haiku ; sinon haiku) → déployer → répondre avec https://hood.markets/?token=0x…
acheter 0,01 ETH de 0x4895… sur hood
→ prepare-buy → valider → /wallet/submit → confirmer sur Blockscout
réclamer les frais pour 0x7859… / aider EA à réclamer les frais $HR hood
→ POST /api/agent/claim-for-recipient { "tokenAddress": "0x…" } — si ok: true, répondre avec replyHint uniquement
réclamer les frais pour mon token MTK
→ haiku JWT ou wallet X → POST /api/agent/claim — si ok: true, répondre avec replyHint
Fichiers
| Fichier | Objectif |
|---|---|
references/API-HOST.md |
URL de base API correcte + liste blanche |
references/AGENT-API.md |
Référence des endpoints |
references/AUTH-BOUNDARY.md |
Auth de déploiement/réclamation, JWT, confirmation X, replay |
references/CHAIN-4663.md |
Abandonner si Bankr ne dispose pas de Robinhood Chain |
references/CLAIM-BANKR.md |
Réclamer sans Bankr submit + vérification |
references/TX-VALIDATION.md |
Liste blanche des sélecteurs + checklist pré-submit |
references/BANKR-SUBMIT.md |
Scan de sécurité Bankr — pas de contournement |
references/RESPONSE-SAFETY.md |
Champs hint de confiance + formatage local |
references/PROMPT-INJECTION.md |
Règles de tweet/metadata non fiables |
references/IMAGE-RESOLUTION.md |
Validation du host du logo de déploiement |
references/ONE-LINE-INTENTS.md |
Mappage tweet → API |
references/HOLDER-NFTS.md |
Shares — réclamation via agent uniquement, pas de txs marketplace |
streaming-hints.json |
Détection V3 vs Pro + codes d'erreur preflight |
known-contracts.json |
Adresses Robinhood épinglées |