# Aeon Distribute Tokens

Batch token payouts via the Bankr Wallet API with per-recipient idempotency, two-phase...

- Repository: https://github.com/BankrBot/skills (1208 stars)
- Category: Engineering
- License: see repository
- Last updated: 2026-10-31
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add BankrBot/skills --skill aeon-distribute-tokens -g -a claude-code -y`
Codex: `npx skills add BankrBot/skills --skill aeon-distribute-tokens -g -a codex -y`
Cursor: `npx skills add BankrBot/skills --skill aeon-distribute-tokens -g -a cursor -y`
Gemini CLI: `npx skills add BankrBot/skills --skill aeon-distribute-tokens -g -a gemini-cli -y`

## Description

Batch token payouts via the Bankr Wallet API with per-recipient idempotency, two-phase resolve→execute, dry-run preview, and recovery from partial runs. Re-runs within the same UTC day are a no-op for completed rows. Use for weekly contributor rewards, tip pools, leaderboard payouts, any "pay N wallets X amount" flow where double-sending must be impossible. Triggers: "distribute tokens", "pay contributors", "weekly payout", "send USDC to this list", "tip these handles".

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# aeon-distribute-tokens

Production-grade batch payouts. State is keyed on `(list, recipient, utc_date)` so any re-run within the same day skips already-completed rows.

## Phases

1. **RESOLVE**, load config, check `BANKR_API_KEY` scope (read-write required), preflight portfolio balance, resolve every `@handle` to an EVM address via Bankr Agent, build the plan. Aborts before any transfer if balance < `total × 1.05`.
2. **EXECUTE**, for each `READY` row, call `POST /wallet/transfer`. Persist state to disk **after every line**, not at the end.

Dry-run runs RESOLVE only and prints the plan with no transfers.

## Config

```yaml
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"
```

Token addresses on Base:
- USDC: `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913`
- Native ETH: `tokenAddress: 0x000...000`, `isNativeToken: true`

## API surface

| Endpoint | Purpose |
|---|---|
| `GET /wallet/me` | Preflight: identity + scope check. 403 → key is read-only, abort. |
| `GET /wallet/portfolio?chain=base` | Balance check vs total × 1.05. |
| `POST /agent/prompt` + `GET /agent/job/{id}` | `@handle` → address resolution. Never used for transfers. |
| `POST /wallet/transfer` | The only sanctioned transfer endpoint. |

```bash
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}'
```

## State file

The rest: https://github.com/BankrBot/skills/blob/HEAD/aeon-distribute-tokens/SKILL.md
