nft-skill

Fail

Autonomous AI Artist Agent for generating, evolving, minting, listing, and promoting NFT art on the Base blockchain. Use when the user wants to create AI art, mint ERC-721 NFTs, list on marketplace, monitor on-chain sales, trigger artistic evolution, or announce drops on X/Twitter.

@openclaw
MIT2/22/2026
(0)
1.0k
2
2

Install Skill

Skills are third-party code from public GitHub repositories. SkillHub scans for known malicious patterns but cannot guarantee safety. Review the source code before installing.

Install globally (user-level):

npx skillhub install openclaw/skills/nft-skill

Install in current project:

npx skillhub install openclaw/skills/nft-skill --project

Suggested path: ~/.claude/skills/nft-skill/

SKILL.md Content

---
name: nft-skill
description: >
  Autonomous AI Artist Agent for generating, evolving, minting, listing, and
  promoting NFT art on the Base blockchain. Use when the user wants to create
  AI art, mint ERC-721 NFTs, list on marketplace, monitor on-chain sales,
  trigger artistic evolution, or announce drops on X/Twitter.
metadata:
  version: 1.1.0
  author: AI Artist
  license: MIT
  openclaw:
    emoji: "🎨"
    homepage: "https://github.com/Numba1ne/nft-skill"
    requires:
      bins:
        - node
        - npm
    env:
      BASE_RPC_URL: "${BASE_RPC_URL}"
      BASE_PRIVATE_KEY: "${BASE_PRIVATE_KEY}"
      NFT_CONTRACT_ADDRESS: "${NFT_CONTRACT_ADDRESS}"
      MARKETPLACE_ADDRESS: "${MARKETPLACE_ADDRESS}"
      PINATA_API_KEY: "${PINATA_API_KEY}"
      PINATA_SECRET: "${PINATA_SECRET}"
      LLM_PROVIDER: "${LLM_PROVIDER}"
      OPENROUTER_API_KEY: "${OPENROUTER_API_KEY}"
      GROQ_API_KEY: "${GROQ_API_KEY}"
      OLLAMA_BASE_URL: "${OLLAMA_BASE_URL}"
      IMAGE_PROVIDER: "${IMAGE_PROVIDER}"
      STABILITY_API_KEY: "${STABILITY_API_KEY}"
      OPENAI_API_KEY: "${OPENAI_API_KEY}"
      X_CONSUMER_KEY: "${X_CONSUMER_KEY}"
      X_CONSUMER_SECRET: "${X_CONSUMER_SECRET}"
      X_ACCESS_TOKEN: "${X_ACCESS_TOKEN}"
      X_ACCESS_SECRET: "${X_ACCESS_SECRET}"
    install:
      - id: npm-install
        kind: shell
        command: "cd {baseDir} && npm install && npm run build"
        bins:
          - node
        label: "Install NFT Skill dependencies"
---

# NFT Skill for OpenClaw

Allows an OpenClaw agent to autonomously generate art, mint NFTs, list on marketplace, monitor sales, evolve based on milestones, and post social updates.

## When to Use This Skill

- User asks to generate AI art or procedural digital art
- User wants to mint an NFT on Base
- User wants to list an NFT for sale on the marketplace
- User wants to monitor on-chain NFT sales
- User wants to evolve art style after a sales milestone
- User wants to tweet or announce a new NFT drop on X (Twitter)
- User mentions "NFT", "mint", "Base blockchain", "AI art", "digital art", or "marketplace listing"

## Setup (First Run)

Before first use, ensure the project is built:

```bash
cd {baseDir} && npm install && npm run build
```

The user must populate a `.env` file with their keys:

```bash
cp {baseDir}/.env.example {baseDir}/.env
```

Required variables: `BASE_RPC_URL`, `BASE_PRIVATE_KEY`, `NFT_CONTRACT_ADDRESS`,
`MARKETPLACE_ADDRESS`, `PINATA_API_KEY`, `PINATA_SECRET`, `LLM_PROVIDER`.

To deploy contracts (one-time setup):

```bash
cd {baseDir} && npm run deploy:testnet   # Base Sepolia testnet
cd {baseDir} && npm run deploy:mainnet   # Base mainnet
```

Contract addresses are automatically written to `.env` after deployment.

## Tools

All tools output JSON. The agent should look for the final line matching `{"status":"success",...}` or `{"status":"error",...}`.

---

### 1. generate — Generate Art

Generate new art and upload to IPFS.

```bash
cd {baseDir} && npm run cli -- generate --generation <number> --theme "<description>"
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-g, --generation` | number | yes | Generation number (determines evolution state) |
| `-t, --theme` | string | yes | Art theme description sent to LLM |

**Output:**
```json
{"status": "success", "result": {"imagePath": "...", "metadata": {...}, "metadataUri": "Qm..."}}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- generate --generation 1 --theme "neon cyberpunk city"
```

---

### 2. mint — Mint NFT

Mint a new ERC721 token on Base with an IPFS metadata URI.

```bash
cd {baseDir} && npm run cli -- mint --metadata-uri <uri>
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-m, --metadata-uri` | string | yes | IPFS metadata URI (e.g. `Qm...` or `ipfs://Qm...`) |

**Output:**
```json
{"status": "success", "result": {"tokenId": "1", "txHash": "0x...", "blockNumber": 12345, "gasUsed": "80000"}}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- mint --metadata-uri QmXyz123abc
```

---

### 3. list — List NFT on Marketplace

List a minted NFT for sale on the marketplace.

```bash
cd {baseDir} && npm run cli -- list --token-id <id> --price <eth>
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-i, --token-id` | string | yes | Token ID to list |
| `-p, --price` | string | yes | Listing price in ETH (e.g. `"0.05"`) |

**Output:**
```json
{"status": "success", "result": {"success": true, "price": "0.05", "txHash": "0x..."}}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- list --token-id 1 --price 0.05
```

---

### 4. monitor — Monitor Sales

Watch for sales events in real-time. Streams JSON to stdout until interrupted (Ctrl+C).

```bash
cd {baseDir} && npm run cli -- monitor [--from-block <number>]
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-f, --from-block` | number | no | Replay missed sales from this block before live monitoring |

**Output (per sale):**
```json
{"status": "sale", "result": {"buyer": "0x...", "tokenId": "1", "price": "0.05", "txHash": "0x...", "blockNumber": 12345}}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- monitor --from-block 12000000
```

---

### 5. evolve — Evolve Agent

Trigger the evolution logic when sales milestones are met.

```bash
cd {baseDir} && npm run cli -- evolve --proceeds <eth> --generation <number> --trigger "<reason>"
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-p, --proceeds` | string | yes | Total ETH proceeds earned so far |
| `-g, --generation` | number | yes | Current generation number |
| `--trigger` | string | yes | Human-readable reason for evolution |

**Output:**
```json
{"status": "success", "result": {"previousGeneration": 1, "newGeneration": 2, "improvements": [...], "newAbilities": [...]}}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- evolve --proceeds "0.5" --generation 1 --trigger "Sold 3 NFTs"
```

---

### 6. tweet — Post to X

Post an update to X (Twitter).

```bash
cd {baseDir} && npm run cli -- tweet --content "<text>"
```

**Parameters:**

| Flag | Type | Required | Description |
|------|------|----------|-------------|
| `-c, --content` | string | yes | Tweet text (auto-truncated to 280 chars) |

**Output:**
```json
{"status": "success", "result": "tweet_id_string"}
```

**Example:**
```bash
cd {baseDir} && npm run cli -- tweet --content "New AI art drop incoming! #AIArt #Base"
```

---

## Typical Workflow

A full autonomous cycle the agent should follow:

1. **Generate** art with a theme → receive metadata URI
2. **Mint** the NFT with that URI → receive token ID
3. **List** the NFT on the marketplace at a price
4. **Tweet** about the new listing
5. **Monitor** sales for purchase events
6. **Evolve** when a sales milestone is reached
7. Repeat from step 1 with the new generation number

## Error Handling

- If a command returns `{"status":"error",...}`, read the `message` field and report it to the user.
- Common issues: missing `.env` variables, insufficient wallet balance, network RPC errors.
- For wallet balance issues, suggest the user funds their Base wallet.
- For missing env vars, remind the user to populate `{baseDir}/.env`.

## Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `BASE_RPC_URL` | yes | Base network RPC endpoint |
| `BASE_PRIVATE_KEY` | yes* | Wallet private key (or use `PRIVATE_KEY_FILE`) |
| `PRIVATE_KEY_FILE` | no | Path to file containing the private key (safer alternative to env var) |
| `NFT_CONTRACT_ADDRESS` | yes | Deployed NFTArt contract address |
| `MARKETPLACE_ADDRESS` | yes | Deployed NFTMarketplace contract address |
| `PINATA_API_KEY` | yes | Pinata IPFS API key |
| `PINATA_SECRET` | yes | Pinata IPFS secret |
| `LLM_PROVIDER` | yes | `openrouter`, `groq`, or `ollama` |
| `LLM_MODEL` | no | Model ID override |
| `OPENROUTER_API_KEY` | if LLM_PROVIDER=openrouter | OpenRouter API key |
| `GROQ_API_KEY` | if LLM_PROVIDER=groq | Groq API key |
| `OLLAMA_BASE_URL` | if LLM_PROVIDER=ollama | Ollama base URL |
| `IMAGE_PROVIDER` | no | `stability`, `dalle`, or `procedural` (default) |
| `IMAGE_MODEL` | no | Image model override |
| `STABILITY_API_KEY` | if IMAGE_PROVIDER=stability | Stability AI key |
| `OPENAI_API_KEY` | if IMAGE_PROVIDER=dalle | OpenAI key for DALL-E |
| `X_CONSUMER_KEY` | for tweet | X API consumer key |
| `X_CONSUMER_SECRET` | for tweet | X API consumer secret |
| `X_ACCESS_TOKEN` | for tweet | X access token |
| `X_ACCESS_SECRET` | for tweet | X access token secret |
| `BASESCAN_API_KEY` | no | For contract verification on Basescan |
nft-skill | SkillHub | SkillHub