aeon-distribute-tokens

Par bankrbot · skills

Distribution de tokens en lot via l'API Bankr Wallet avec idempotence par destinataire, deux phases resolve→execute, prévisualisation dry-run, et reprise après exécution partielle. Les re-exécutions effectuées le même jour UTC sont des no-ops pour les lignes déjà traitées. À utiliser pour les récompenses hebdomadaires de contributeurs, les pools de pourboires, les classements de paiement — tout flux « payer N wallets X montant » où les doublons d'envoi doivent être impossibles. Déclencheurs : « distribute tokens », « pay contributors », « weekly payout », « send USDC to this list », « tip these handles ».

npx skills add https://github.com/bankrbot/skills --skill aeon-distribute-tokens

aeon-distribute-tokens

Paiements par lots de production. L'état est indexé sur (list, recipient, utc_date) donc toute réexécution le même jour ignore les lignes déjà complétées.

Phases

  1. RESOLVE — charger la config, vérifier le scope BANKR_API_KEY (lecture-écriture requis), vérifier le solde du portefeuille, résoudre chaque @handle en adresse EVM via Bankr Agent, construire le plan. Avorte avant tout transfert si solde < total × 1.05.
  2. EXECUTE — pour chaque ligne READY, appeler POST /wallet/transfer. Persister l'état sur disque après chaque ligne, pas à la fin.

Une dry-run exécute seulement RESOLVE et affiche le plan sans transferts.

Config

defaults:
  token: USDC
  amount: "5"
  chain: base

lists:
  contributors:
    description: "Weekly contributor rewards"
    token: USDC
    amount: "10"
    recipients:
      - handle: "@alice"
        amount: "15"
      - handle: "@bob"
      - address: "0x742d...5678"
        label: "Charlie"
        amount: "20"

Adresses de tokens sur Base :

  • USDC : 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913
  • ETH natif : tokenAddress: 0x000...000, isNativeToken: true

Surface d'API

Endpoint Objectif
GET /wallet/me Préflight : vérification d'identité + scope. 403 → clé en lecture seule, avorter.
GET /wallet/portfolio?chain=base Vérification du solde vs total × 1.05.
POST /agent/prompt + GET /agent/job/{id} Résolution @handle → adresse. Jamais utilisé pour les transferts.
POST /wallet/transfer Le seul endpoint de transfert autorisé.
curl -fsS -X POST "https://api.bankr.bot/wallet/transfer" \
  -H "X-API-Key: ${BANKR_API_KEY}" -H "Content-Type: application/json" \
  -d '{"recipientAddress":"0x...","tokenAddress":"0x8335...","amount":"15","isNativeToken":false}'

Fichier d'état

{
  "contributors|@alice|2026-05-12": {
    "list": "contributors", "recipient": "@alice", "address": "0x...",
    "amount": "15", "token": "USDC",
    "status": "completed", "txHash": "0x...",
    "timestamp": "2026-05-12T12:34:56Z"
  }
}

Lire avant d'envoyer ; persister après chaque ligne.

Gestion des résultats

Réponse Action
200 + success: true Marquer complété, stocker txHash, persister immédiatement.
200 + success: false Marquer échoué avec raison de l'erreur.
403 Clé a perdu le scope en écriture — avorter les lignes restantes.
429 Attendre 60s, réessayer une fois ; si toujours 429 avorter les lignes restantes.
5xx / réseau Réessayer une fois après 10s ; marquer échoué si toujours mauvais.

Sortie

Ligne de verdict d'abord : COMPLETE / PARTIAL / FAILED / DRY_RUN / NOTHING_TO_SEND. Puis détail par ligne avec liens tx basescan pour les succès et codes raison pour les échecs.

Règles

  • L'idempotence est non-négociable. Lire l'état avant d'envoyer, persister après chaque ligne.
  • Préflight avec 5% de marge — ne jamais démarrer une exécution partielle.
  • Wallet API pour les transferts seulement. Agent API résout les handles ; il ne déplace pas de tokens.
  • Rate limit Bankr (100/jour standard) est un plafond dur — diviser les listes de > 50.
  • Les handles non-résolubles sont ignorés avec RESOLVE_FAILED, pas échoués bruyamment — le reste du plan s'exécute.

Scope requis

BANKR_API_KEY avec Wallet API activée et accès lecture-écriture. Les clés en lecture seule retournent 403 au préflight.

Skills similaires