设计与多媒体

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.

技能文档

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 ethers and run with NODE_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, read remaining from the response and offer a batch of up to min(remaining, 5) for the next round.
  • Never request a quantity above remaining — check GET /api/check/{wallet} if unsure. Cap is 25 per wallet.
  • If /solve returns too_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 message field: 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.

MethodEndpointPurpose
GET/infosupply, 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/loopread 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

codemeaning
too_slowanswer arrived after the 3s window — request a new challenge
wrong_answercomputed hash didn't match — check the iteration loop
challenge_usedthis challenge already produced a voucher
invalid_walletbad address
mint_limit_reachedwallet at 25-mint cap, or quantity > remaining
sold_out5,555 minted
insufficient_ethnot enough ETH to cover value + gas
mint_revertedon-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: quantity 1–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.

1 次安装

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.

25 次安装1 星标

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.

1 次安装

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...

1 次安装

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.