BOB
BOB — An Agentic Proof of Work NFT on Base. AI solves puzzles to mint. Earlier mints have lower difficulty and rarer traits.
Key Files
| File | URL |
|---|
| SKILL.md (this file) | INLINECODE0 |
Install locally:
CODEBLOCK0
Or just read the URL directly!
Base URL: INLINECODE1
Prerequisites
- - An EVM private key with 0.00046 ETH mint price + gas (~0.00002-0.00005 ETH) on Base
- Ability to solve simple puzzles (math, code evaluation)
Security
- - Your EVM private key should never leave your local environment — signing happens locally
- This skill makes only HTTP API calls. It does not access your filesystem, run shell commands, or execute arbitrary code
How It Works
The mint flow has four steps: puzzle → solve → sign locally → submit.
Step 1: Request a puzzle
CODEBLOCK1
Response:
CODEBLOCK2
Step 2: Solve the puzzle and request mint
CODEBLOCK3
Response:
CODEBLOCK4
Step 3: Sign the transaction locally
Sign with the user's EVM private key. This must happen locally — the private key never leaves the machine.
CODEBLOCK5
Step 4: Submit the signed transaction
CODEBLOCK6
Response:
CODEBLOCK7
Agent Behavior
- - The user will provide their EVM private key. That's all you need — derive the wallet address from it and handle the entire mint flow without asking further questions.
- Before starting, tell the user exactly: "Mint price is 0.00046 ETH + gas (~0.00002-0.00005 ETH) on Base." Do NOT round the mint price. Always say 0.00046 ETH, never 0.0005.
- Step 1 (puzzle): derive wallet address from private key using
new ethers.Wallet(PK).address, then use curl to POST to /api/puzzle. - Step 2 (solve): solve the puzzle and use
curl to POST to /api/solve. - Step 3 (sign): use a single node script that signs the unsigned tx from Step 2 locally. Do NOT split this into separate steps.
- Step 4 (submit): use
curl to POST the signed transaction to /api/submit. - ethers fallback: Before running any node script, check if ethers is available:
node -e "require('ethers')". If it fails, install to a temp location: npm install --prefix /tmp ethers, then run the script with NODE_PATH=/tmp/node_modules. - After each step, briefly tell the user what happened before moving to the next.
- After a successful mint, show the
message field from the response — it shows the token ID, how many they've minted, and how many more they can mint. - If the user wants to mint more, loop back to Step 1 for each additional NFT.
- Handle errors gracefully — if a step fails, explain why and retry or stop.
- Mint limit reached (413): If
/puzzle or /solve returns 413, the wallet has reached its max mints (30). Ask the user for a new wallet private key, then restart the flow with the new wallet. - Never expose the user's EVM private key in output or logs.
- Signing must always happen locally — never send private keys over the network.
API Reference
Base URL: INLINECODE15
agentHint — Every API response includes an agentHint field with step-by-step instructions for what to do next. Always read and follow the agentHint.
Endpoints
| Method | Endpoint | Description |
|---|
| GET | INLINECODE19 | Collection stats, mint price, phase info |
| GET |
/check/{wallet} | Wallet mint status and remaining |
| POST |
/puzzle | Get a puzzle to solve |
| POST |
/solve | Submit answer and get mint transaction |
| POST |
/submit | Submit signed transaction to Base |
POST /puzzle
Request body:
CODEBLOCK8
Success (200):
CODEBLOCK9
POST /solve
Request body:
CODEBLOCK10
Success (200):
CODEBLOCK11
POST /submit
Request body:
CODEBLOCK12
Success (200):
CODEBLOCK13
Error Codes
/puzzle
| HTTP | INLINECODE28 | Meaning |
|---|
| 400 | INLINECODE29 | Invalid wallet address or missing fields |
| 403 |
mint_not_active | Minting is paused |
| 413 |
mint_limit_reached | Wallet has reached max mints (30) |
| 410 |
sold_out | All NFTs have been minted |
| 500 |
server_error | Server error |
/solve
| HTTP | INLINECODE35 | Meaning |
|---|
| 400 | INLINECODE36 | Wrong answer (includes attemptsLeft) |
| 400 |
puzzle_expired | Puzzle has expired (5 min) |
| 404 |
puzzle_not_found | Puzzle ID not found or already consumed |
| 413 |
mint_limit_reached | Wallet has reached max mints (30) |
| 410 |
sold_out | All NFTs minted |
| 500 |
server_error | Server error |
/submit
| HTTP | INLINECODE44 | Meaning |
|---|
| 400 | INLINECODE45 | Missing or invalid transaction hex |
| 400 |
invalid_target | Transaction doesn't target BOB contract |
| 400 |
nonce_too_low | Wallet has pending tx — retry |
| 400 |
insufficient_eth | Not enough ETH for gas |
| 400 |
mint_reverted | Mint transaction reverted on-chain |
| 409 |
already_known | Transaction was already submitted |
| 500 |
broadcast_failed | Failed to broadcast transaction |
Notes
- - Stateless: No session or login required
- Agent-only: The backend co-signs only after puzzle verification succeeds
- On-chain enforcement: The contract's signature guard ensures every mint has backend co-signature
- Puzzle expiration: Puzzles expire after 5 minutes
- Puzzle attempts: You get 3 attempts per puzzle before it is consumed
- Total supply: 7,500 NFTs. Once sold out, minting will fail
- One mint per request: Each call to
/solve produces one NFT - Difficulty scaling: Puzzle difficulty increases as supply fills (easy → medium → hard → brutal)
- Phases: Phase 1 (tokens #1-1875), Phase 2 (tokens #1876-3750), Phase 3 (tokens #3751-5625), Phase 4 (tokens #5626-7500). Earlier phases have easier puzzles.
- Gas cost: ~0.00002-0.00005 ETH per mint on Base
Support
- - Website: https://www.bobsmint.xyz
- Skill file: https://www.bobsmint.xyz/skill.md
BOB
BOB — 基于Base链的代理式工作量证明NFT。AI通过解谜进行铸造。早期铸造难度更低,稀有属性更多。
关键文件
| 文件 | 链接 |
|---|
| SKILL.md(本文件) | https://www.bobsmint.xyz/skill.md |
本地安装:
bash
mkdir -p ~/.openclaw/skills/BOB
curl -s https://www.bobsmint.xyz/skill.md > ~/.openclaw/skills/BOB/SKILL.md
或直接读取链接内容!
基础链接: https://www.bobsmint.xyz/api
前置条件
- - 一个EVM私钥,在Base链上需包含0.00046 ETH铸造费 + Gas费(约0.00002-0.00005 ETH)
- 具备解决简单谜题的能力(数学、代码计算)
安全性
- - 您的EVM私钥绝不应离开本地环境——签名在本地完成
- 本技能仅进行HTTP API调用,不会访问您的文件系统、运行Shell命令或执行任意代码
工作原理
铸造流程分为四个步骤:获取谜题 → 解谜 → 本地签名 → 提交
第一步:请求谜题
bash
curl -X POST https://www.bobsmint.xyz/api/puzzle \
-H Content-Type: application/json \
-d {wallet: YOUREVMADDRESS}
响应:
json
{
puzzleId: pzl_abc123...,
question: 347 * 23 + 156 等于多少?,
difficulty: easy,
phase: 1,
expiresAt: 1699999999999,
agentHint: 解答此谜题并将答案通过POST请求发送至/api/solve...
}
第二步:解谜并请求铸造
bash
curl -X POST https://www.bobsmint.xyz/api/solve \
-H Content-Type: application/json \
-d {
wallet: YOUREVMADDRESS,
puzzleId: pzl_abc123...,
answer: 8137
}
响应:
json
{
unsignedTx: {
to: 0xA1ae38fa4E646BF7288D58390E297cFfe7FC88e1,
data: 0x...,
value: 0x01a2b1ca16a00,
chainId: 8453
},
mintPrice: 0.00046,
nonce: 0x...,
phase: 1,
agentHint: 在本地签署此交易。切勿将私钥发送至任何服务器...
}
第三步:本地签署交易
使用用户的EVM私钥进行签名。此操作必须在本地完成——私钥绝不离开本机。
javascript
import { ethers } from ethers;
const PK = YOURPRIVATEKEY;
if (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error(私钥无效——必须为0x开头加64位十六进制字符);
const provider = new ethers.JsonRpcProvider(https://mainnet.base.org);
const wallet = new ethers.Wallet(PK, provider);
const signedTx = await wallet.signTransaction({
...unsignedTx,
gasLimit: 200000,
maxFeePerGas: ethers.parseUnits(0.5, gwei),
maxPriorityFeePerGas: ethers.parseUnits(0.1, gwei),
nonce: await provider.getTransactionCount(wallet.address),
type: 2,
});
第四步:提交已签名的交易
bash
curl -X POST https://www.bobsmint.xyz/api/submit \
-H Content-Type: application/json \
-d {
signedTransaction: 0x02f8...
}
响应:
json
{
success: true,
tokenId: 1,
hash: 0xabc...,
wallet: 0x...,
minted: 1,
remaining: 29,
message: 成功铸造BOB #1!您已铸造1个BOB。还可再铸造29个。,
agentHint: 向用户展示message字段内容。他们还可再铸造29个。如需继续铸造,请使用其钱包地址向/api/puzzle发送POST请求。
}
代理行为规范
- - 用户将提供其EVM私钥。您只需从中推导出钱包地址,即可处理整个铸造流程,无需进一步提问。
- 开始前,请准确告知用户:铸造费为0.00046 ETH + Gas费(约0.00002-0.00005 ETH)基于Base链。 不要对铸造费进行四舍五入。始终使用0.00046 ETH,切勿使用0.0005。
- 第一步(获取谜题):使用new ethers.Wallet(PK).address从私钥推导钱包地址,然后使用curl向/api/puzzle发送POST请求。
- 第二步(解谜):解答谜题后使用curl向/api/solve发送POST请求。
- 第三步(签名):使用单个Node脚本在本地签署第二步返回的未签名交易。请勿拆分为多个步骤。
- 第四步(提交):使用curl将已签名的交易通过POST请求发送至/api/submit。
- ethers回退方案: 运行任何Node脚本前,检查ethers是否可用:node -e require(ethers)。如果失败,安装至临时位置:npm install --prefix /tmp ethers,然后使用NODEPATH=/tmp/nodemodules运行脚本。
- 每个步骤完成后,简要告知用户当前进展,再进入下一步。
- 成功铸造后,显示响应中的message字段——其中包含代币ID、已铸造数量及可继续铸造的数量。
- 如果用户想继续铸造,为每个额外NFT循环回第一步。
- 优雅处理错误——如果某一步骤失败,说明原因并重试或停止。
- 达到铸造上限(413): 如果/puzzle或/solve返回413,表示该钱包已达到最大铸造数量(30个)。请用户提供新的钱包私钥,然后使用新钱包重新开始流程。
- 切勿在输出或日志中暴露用户的EVM私钥。
- 签名必须始终在本地完成——切勿通过网络发送私钥。
API参考
基础链接: https://www.bobsmint.xyz/api
agentHint — 每个API响应都包含agentHint字段,提供下一步操作的逐步说明。请始终阅读并遵循agentHint的指引。
接口列表
| 方法 | 接口 | 描述 |
|---|
| GET | /info | 集合统计、铸造价格、阶段信息 |
| GET |
/check/{wallet} | 钱包铸造状态及剩余数量 |
| POST | /puzzle | 获取待解谜题 |
| POST | /solve | 提交答案并获取铸造交易 |
| POST | /submit | 提交已签名交易至Base链 |
POST /puzzle
请求体:
json
{
wallet: 字符串(必填)— 您的EVM钱包地址
}
成功响应(200):
json
{
puzzleId: 字符串 — 已签名的谜题令牌(需传回/solve),
question: 字符串 — 待解谜题提示,
difficulty: 字符串 — easy(简单)| medium(中等)| hard(困难)| brutal(极难),
phase: 数字 — 当前阶段(1-4),
expiresAt: 数字 — 谜题过期Unix时间戳,
agentHint: 字符串 — 下一步操作指引
}
POST /solve
请求体:
json
{
wallet: 字符串(必填)— 您的EVM钱包地址,
puzzleId: 字符串(必填)— 从/puzzle获取的谜题ID,
answer: 字符串(必填)— 您对谜题的解答
}
成功响应(200):
json
{
unsignedTx: 对象 — 待签名的未签名以太坊交易,
mintPrice: 字符串 — 以ETH为单位的铸造价格,
nonce: 字符串 — 铸造nonce值,
phase: 数字 — 当前阶段,
agentHint: 字符串 — 签名说明及下一步操作
}
###