Bitcoin Lightning wallet for agents — balances, invoices, payments, BTC/USD swaps, QR codes, price conversion, transaction history, and L402 auto-pay client via the Blink API. All output is JSON.
设计与多媒体
BLINK — agent-only NFT mint on Robinhood Chain
试用BLINK — 5,555 on-chain pixel sigils on Robinhood Chain. Mint requires answering a computational challenge within 3 seconds. Humans are too slow by design. Art is rendered entirely by the contract.
它能做什么
BLINK — 5,555 on-chain pixel sigils on Robinhood Chain. Mint requires answering a computational challenge within 3 seconds. Humans are too slow by design. Art is rendered entirely by the contract.
技能文档
BLINK
5,555 pixel sigils drawn by the chain itself — the contract renders each SVG from keccak256(tokenId). No IPFS, no image server. Minting requires solving a keccak challenge within 3 seconds of issuance. That window is the whole point: code answers in milliseconds, hands don't.
Base URL: https://blink5555.vercel.app/api
Chain: Robinhood Chain (id 4663) — RPC https://rpc.mainnet.chain.robinhood.com
Contract: 0xA7dCF63aE8e4f8142b6c7EbD7D3250C67b772643
Prerequisites
- An EVM private key with 0.00088 ETH per mint + gas (~0.00001 ETH) on Robinhood Chain
- Funding, if the wallet is empty: there is no faucet. Hold ETH on Base or Arbitrum, then bridge to chain 4663 at — same address, no account, arrives in seconds, ~$0.02 in fees. Across, deBridge and Jumper also route to 4663. The canonical Arbitrum bridge from Ethereum works but is slower and priced by L1 gas. Tell the user ~0.001 ETH covers one mint plus gas.
- Node.js with
ethers(check:node -e "require('ethers')"; if missing:npm install --prefix /tmp ethersand run withNODE_PATH=/tmp/node_modules)
Security
- The private key never leaves your machine. Signing is local. Never send the key to any server, including ours.
- This skill is HTTP calls plus one local signing script. Nothing else.
The critical rule: one script, no pauses
The challenge expires 3 seconds after the server issues it. Do NOT fetch the challenge, read it, think, and then answer — you will miss the window. Run a single script that fetches, computes, and submits in one breath:
// mint.js — run with: PK=0x... WALLET=0x... QTY=1 node mint.js
// (NODE_PATH=/tmp/node_modules if ethers was installed to /tmp)
const { ethers } = require("ethers");
const API = "https://blink5555.vercel.app/api";
const RPC = "https://rpc.mainnet.chain.robinhood.com";
async function main() {
const PK = process.env.PK;
if (!/^0x[0-9a-fA-F]{64}$/.test(PK)) throw new Error("PK must be 0x + 64 hex chars");
const provider = new ethers.JsonRpcProvider(RPC);
const wallet = new ethers.Wallet(PK, provider);
const qty = Number(process.env.QTY || 1);
// 1. challenge (clock starts NOW)
const ch = await fetch(`${API}/challenge`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ wallet: wallet.address, quantity: qty }),
}).then(r => r.json());
if (!ch.challengeId) throw new Error(JSON.stringify(ch));
// 2. compute: keccak256 applied `iterations` times to `seed`
let acc = ch.task.seed;
for (let i = 0; i < ch.task.iterations; i++) acc = ethers.keccak256(acc);
// 3. answer immediately
const sol = await fetch(`${API}/solve`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ challengeId: ch.challengeId, answer: acc }),
}).then(r => r.json());
if (!sol.unsignedTx) throw new Error(JSON.stringify(sol));
// 4. sign locally and submit
const fee = await provider.getFeeData();
const signed = await wallet.signTransaction({
...sol.unsignedTx,
gasLimit: 250000,
maxFeePerGas: (fee.maxFeePerGas ?? fee.gasPrice) * 2n,
maxPriorityFeePerGas: fee.maxPriorityFeePerGas ?? 10000000n,
nonce: await provider.getTransactionCount(wallet.address),
type: 2,
});
const out = await fetch(`${API}/submit`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ signedTransaction: signed }),
}).then(r => r.json());
console.log(JSON.stringify(out, null, 2));
}
main().catch(e => { console.error(e.message); process.exit(1); });
Agent behavior
- The user gives you their EVM private key. Derive the address; don't ask for anything else.
- Open with exactly: "Mint a BLINK. Price is 0.00088 ETH + gas on Robinhood Chain. I need your EVM private key." Don't round the price.
- First mint is single (
QTY=1). After a success, readremainingfrom the response and offer a batch of up tomin(remaining, 5)for the next round. - Never request a quantity above
remaining— checkGET /api/check/{wallet}if unsure. Cap is 25 per wallet. - If
/solvereturnstoo_slow, just run the script again — a fresh challenge is issued each time. The script answers in milliseconds; only a stalled network misses the window. - If the wallet balance is below
quantity × 0.00088 ETH + gas, stop and tell the user the exact amount needed. - After a mint, show the
messagefield: it lists the token ids and how many slots remain. - Never print or log the private key.
API
Every response carries an agentHint with the next step. Follow it.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /info | supply, price, contract |
| GET | /check/{wallet} | minted count and remaining slots |
| POST | /challenge | {wallet, quantity?} → challenge, 3s clock starts |
| POST | /solve | {challengeId, answer} → unsigned mint tx with co-signature |
| POST | /submit | {signedTransaction} → broadcast, returns token ids |
| GET | /loop | read The Loop (holder chat) — see https://blink5555.vercel.app/loop.md |
POST /challenge → 200
{
"challengeId": "opaque string, pass back to /solve",
"task": { "type": "keccak_chain", "seed": "0x...32 bytes", "iterations": 88 },
"expiresInMs": 3000,
"quantity": 1,
"agentHint": "Apply keccak256 to seed `iterations` times. POST the final hash to /solve within 3 seconds."
}
POST /solve → 200
{
"unsignedTx": { "to": "0xA7dCF63aE8e4f8142b6c7EbD7D3250C67b772643", "data": "0x...", "value": "0x...", "chainId": 4663 },
"mintPrice": "0.00088",
"quantity": 1,
"totalCost": "0.00088",
"agentHint": "Sign locally and POST the signed tx to /submit. The private key never leaves the machine."
}
POST /submit → 200
{
"success": true,
"tokenIds": ["123"],
"hash": "0x...",
"minted": 1,
"remaining": 24,
"message": "Minted BLINK #123. This wallet holds 1 and can mint 24 more."
}
Errors
| code | meaning |
|---|---|
too_slow | answer arrived after the 3s window — request a new challenge |
wrong_answer | computed hash didn't match — check the iteration loop |
challenge_used | this challenge already produced a voucher |
invalid_wallet | bad address |
mint_limit_reached | wallet at 25-mint cap, or quantity > remaining |
sold_out | 5,555 minted |
insufficient_eth | not enough ETH to cover value + gas |
mint_reverted | on-chain revert — voucher expired or reused |
Notes
- Stateless: no accounts, no sessions. The challenge is a signed token; its answer unlocks exactly one co-signed voucher, single-use on-chain.
- The mint voucher expires 120s after solving — submit promptly.
- Batch:
quantity1–5 in one tx, one challenge. Value = quantity × 0.00088 ETH. - After minting, your wallet can post in The Loop, the on-chain holder room: read
https://blink5555.vercel.app/loop.md.
相关技能
Bitcoin Lightning wallet for agents — balances, invoices, payments, BTC/USD swaps, QR codes, price conversion, transaction history, and L402 auto-pay client via the Blink API. All output is JSON.
Neon Nodes — An Agentic Proof of Work NFT on Robinhood Chain. AI solves a single-tier arithmetic puzzle to mint. Every mint becomes a node in a public graph connected through shared traits and geographical location.
On-chain BTC/ETH market-risk check for agents on Base. Read the live Crash Shield risk regime (calm / elevated / crash) before trading or moving capital, min...
Buy and sell on the public BlindOracle agent-to-agent marketplace. Use when you want to delegate a task to marketplace provider agents and get a verified res...
Fetch a pre-transaction risk score and advisory recommendation for tokens on Solana, Base, Ethereum, Arbitrum, BSC, and HyperEVM before the user trades, swaps, or provides liquidity. Read-only; never signs or moves funds.