clawphunks-e3b0c4 — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited clawphunks-e3b0c4 (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
10,000 unique left-facing pixel punks with OpenClaw red (#C83232) backgrounds. The first NFT collection designed for AI agents.
ClawPhunks mirror the original CryptoPunks rarity. Rare types command significant premiums.
| Type | Count | % | Rarity Rank |
|---|---|---|---|
| Alien | 9 | 0.09% | ★★★★★ |
| Ape | 24 | 0.24% | ★★★★☆ |
| Zombie | 88 | 0.88% | ★★★☆☆ |
| Female | 3,840 | 38.4% | ★★☆☆☆ |
| Male | 6,039 | 60.39% | ★☆☆☆☆ |
The rarest type. Only 9 exist:
| Token ID | Accessories |
|---|---|
| #0635 | Bandana, Regular Shades |
| #2890 | Cap |
| #3100 | Headband |
| #3443 | Earring, Cowboy Hat |
| #5822 | Bandana |
| #5905 | Do-rag, Small Shades |
| #6089 | Earring, Knitted Cap |
| #7523 | Earring, Knitted Cap, Medical Mask |
| #7804 | Cap Forward, Pipe, Small Shades |
| Token ID | Accessories |
|---|---|
| #0372 | Cap Forward |
| #1021 | Cap, Eye Patch |
| #2140 | Knitted Cap, Small Shades |
| #2243 | Bandana, Nerd Glasses |
| #2386 | Headband, Small Shades |
| #2460 | Bandana, VR |
| #2491 | Cap |
| #2711 | Cap Forward, Earring |
| #2924 | Hoodie |
| #4156 | Bandana |
| #4178 | Do-rag |
| #4464 | Eye Mask, Vape, Do-rag |
| #5217 | Gold Chain, Knitted Cap |
| #5314 | Horned Rim Glasses, Do-rag |
| #5577 | Cowboy Hat |
| #5795 | Police Cap |
| #6145 | Cigarette, Cap, Earring |
| #6915 | Cap, Earring, Eye Patch |
| #6965 | Fedora |
| #7191 | Nerd Glasses, Knitted Cap |
| #8219 | Knitted Cap |
| #8498 | Top Hat, Regular Shades |
| #9265 | Bandana, Big Shades |
| #9280 | 3D Glasses, Cowboy Hat |
All 88 Zombie token IDs:
| Token ID | Accessories |
|---|---|
| #0117 | Messy Hair, Front Beard Dark |
| #0987 | Wild Hair, Horned Rim Glasses |
| #1119 | Shadow Beard, Do-rag, Eye Patch |
| #1190 | Cigarette, Bandana, Handlebars, Earring |
| #1374 | Big Shades, Earring, Mohawk Dark |
| #1478 | Shadow Beard, Wild Hair |
| #1526 | Cap, Gold Chain, Eye Patch |
| #1658 | Stringy Hair |
| #1748 | Front Beard, Frown, Knitted Cap |
| #1886 | Messy Hair, Shadow Beard |
| #1935 | Earring, Shaved Head |
| #2066 | Knitted Cap |
| #2132 | Normal Beard Black, Hoodie, Nerd Glasses |
| #2249 | Bandana, Eye Patch |
| #2306 | Cigarette, Mohawk Thin, Earring |
| #2329 | Peak Spike, Earring |
| #2338 | Mohawk Thin |
| #2424 | Bandana, Frown, Earring |
| #2484 | Wild Hair, Classic Shades |
| #2560 | Front Beard, Earring, Headband, VR |
| #2566 | Messy Hair, Normal Beard |
| #2681 | Clown Eyes Blue, Cap |
| #2708 | Bandana, Earring |
| #2938 | Wild Hair |
| #2967 | Mohawk Thin, Chinstrap |
| #3211 | Goat, Headband |
| #3328 | Cigarette, Messy Hair |
| #3393 | Frown, Crazy Hair |
| #3489 | Stringy Hair, Eye Patch |
| #3493 | Peak Spike, Shadow Beard |
| #3609 | Earring, Do-rag |
| #3636 | Front Beard Dark, Earring, Top Hat |
| #3831 | Vampire Hair, Big Shades, Medical Mask |
| #4472 | Cigarette, Purple Hair |
| #4513 | Beanie, Luxurious Beard, Earring |
| #4559 | Stringy Hair, Earring |
| #4747 | Clown Eyes Blue, Headband |
| #4830 | Wild Hair, Classic Shades, Medical Mask |
| #4850 | Purple Hair |
| #4874 | Cigarette, Messy Hair, Clown Nose, Mustache, Earring (5 acc!) |
| #5066 | Earring, Knitted Cap, Smile |
| #5234 | Big Shades, Earring, Crazy Hair |
| #5253 | Messy Hair, Mole |
| #5299 | Cigarette, Handlebars, Earring, Mohawk Dark |
| #5312 | Luxurious Beard, Knitted Cap |
| #5336 | Police Cap |
| #5412 | Nerd Glasses, Crazy Hair |
| #5489 | Fedora |
| #5573 | Luxurious Beard, Mohawk, 3D Glasses |
| #5742 | Mohawk Dark |
| #5761 | Bandana, Horned Rim Glasses |
| #5944 | Mohawk |
| #6275 | Shadow Beard, Mohawk Dark |
| #6297 | Cigarette, Nerd Glasses, Top Hat |
| #6304 | Crazy Hair, Regular Shades |
| #6491 | Cap Forward, Shadow Beard, Earring |
| #6515 | Cigarette, Wild Hair |
| #6586 | Knitted Cap, Smile |
| #6649 | Front Beard Dark, Crazy Hair |
| #6704 | Cigarette, Earring, Rosy Cheeks |
| #6784 | Cigarette, Bandana, Frown |
| #7014 | Cigarette, Frumpy Hair |
| #7121 | Frumpy Hair, Horned Rim Glasses |
| #7127 | Bandana, Eye Mask, Earring |
| #7252 | Chinstrap, Earring, Crazy Hair |
| #7337 | Normal Beard Black, Peak Spike |
| #7458 | Shadow Beard, Knitted Cap, Regular Shades |
| #7660 | Smile, Do-rag |
| #7756 | Shadow Beard, Horned Rim Glasses, Do-rag |
| #7914 | Normal Beard Black, Knitted Cap |
| #8127 | Headband |
| #8307 | Stringy Hair, Mustache |
| #8386 | Classic Shades, Crazy Hair |
| #8472 | Mohawk Thin, Small Shades |
| #8531 | Stringy Hair, Goat, Regular Shades |
| #8553 | Front Beard Dark |
| #8780 | Frumpy Hair, Shadow Beard |
| #8857 | Wild Hair, 3D Glasses |
| #8909 | Luxurious Beard, Police Cap, Regular Shades |
| #8957 | Frumpy Hair, Luxurious Beard |
| #9203 | Clown Nose, Cap Forward, Goat, Mole |
| #9368 | Hoodie, Earring |
| #9474 | Peak Spike |
| #9804 | Stringy Hair, Shadow Beard, Smile, Small Shades |
| #9838 | Peak Spike, Front Beard Dark, Earring |
| #9909 | Cap |
| #9955 | Shaved Head |
| #9997 | Front Beard, Cap Forward |
| Accessory | Count | Rarity |
|---|---|---|
| Beanie | 44 | ★★★★★ |
| Choker | 48 | ★★★★★ |
| Pilot Helmet | 54 | ★★★★★ |
| Tiara | 55 | ★★★★★ |
| Orange Side | 68 | ★★★★☆ |
| Buck Teeth | 78 | ★★★★☆ |
| Welding Goggles | 86 | ★★★★☆ |
| Top Hat | 115 | ★★★☆☆ |
| Cowboy Hat | 142 | ★★★☆☆ |
| Tassle Hat | 178 | ★★★☆☆ |
| Fedora | 186 | ★★★☆☆ |
| Police Cap | 203 | ★★☆☆☆ |
| Clown Nose | 212 | ★★☆☆☆ |
| Hoodie | 259 | ★★☆☆☆ |
| Bandana | 481 | ★☆☆☆☆ |
| Earring | 2,459 | Common |
Phunks with more accessories are rarer:
import { privateKeyToAccount, generatePrivateKey } from 'viem/accounts';
import { createWalletClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const privateKey = generatePrivateKey();
const account = privateKeyToAccount(privateKey);
console.log('Address:', account.address);
// Store privateKey securely!
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http('https://eth.llamarpc.com'),
});Endpoint: POST https://clawphunks.vercel.app/mint
Payment: $1.99 USDC on Base via x402 protocol
Request:
{
"recipient": "0xYourWalletAddress"
}Response:
{
"success": true,
"tokenId": 1234,
"txHash": "0x...",
"ethscriptionId": "0x...",
"gasStipendWei": "13333333333333",
"viewerUrl": "https://ethscriptions.com/ethscriptions/0x...",
"nextSteps": {
"trade": "Use escrow contract on L1",
"list": "depositAndList(ethscriptionId, priceWei)",
"buy": "buy(ethscriptionId) with msg.value = price"
}
}You receive:
Escrow Contract: 0x3e67d49716e50a8b1c71b8dEa0e31755305733fd
The escrow contract handles trustless trading using ESIP-2.
#### List for Sale
depositAndList(bytes32 ethscriptionId, uint256 priceWei)import { encodeFunctionData } from 'viem';
// First, send ethscription to escrow (send tx to contract with ethscription data)
// Then list it:
const data = encodeFunctionData({
abi: ESCROW_ABI,
functionName: 'depositAndList',
args: [ethscriptionId, priceWei],
});
await walletClient.sendTransaction({
to: '0x3e67d49716e50a8b1c71b8dEa0e31755305733fd',
data,
});#### Buy a Listing
// Check listing
const [active, seller, price] = await publicClient.readContract({
address: '0x3e67d49716e50a8b1c71b8dEa0e31755305733fd',
abi: ESCROW_ABI,
functionName: 'getListing',
args: [ethscriptionId],
});
// Buy it
await walletClient.writeContract({
address: '0x3e67d49716e50a8b1c71b8dEa0e31755305733fd',
abi: ESCROW_ABI,
functionName: 'buy',
args: [ethscriptionId],
value: price,
});#### Cancel Listing
await walletClient.writeContract({
address: '0x3e67d49716e50a8b1c71b8dEa0e31755305733fd',
abi: ESCROW_ABI,
functionName: 'cancelAndWithdraw',
args: [ethscriptionId],
});Health check.
Returns collection info, mint stats, and agent instructions.
{
"name": "ClawPhunks",
"symbol": "CPHUNK",
"totalSupply": 10000,
"minted": 0,
"available": 10000,
"mintPrice": "1.99",
"mintCurrency": "USDC",
"chain": "ethereum",
"escrowContract": "0x3e67d49716e50a8b1c71b8dEa0e31755305733fd",
"agentInstructions": { ... }
}Mint a random phunk. Requires x402 payment ($1.99 USDC on Base).
[
{
"name": "depositAndList",
"type": "function",
"inputs": [
{ "name": "ethscriptionId", "type": "bytes32" },
{ "name": "price", "type": "uint256" }
]
},
{
"name": "buy",
"type": "function",
"stateMutability": "payable",
"inputs": [
{ "name": "ethscriptionId", "type": "bytes32" }
]
},
{
"name": "cancelAndWithdraw",
"type": "function",
"inputs": [
{ "name": "ethscriptionId", "type": "bytes32" }
]
},
{
"name": "getListing",
"type": "function",
"stateMutability": "view",
"inputs": [
{ "name": "ethscriptionId", "type": "bytes32" }
],
"outputs": [
{ "name": "active", "type": "bool" },
{ "name": "seller", "type": "address" },
{ "name": "price", "type": "uint256" }
]
},
{
"name": "updatePrice",
"type": "function",
"inputs": [
{ "name": "ethscriptionId", "type": "bytes32" },
{ "name": "newPrice", "type": "uint256" }
]
}
]Each ClawPhunk has embedded traits in the ethscription metadata:
{
"attributes": [
{ "trait_type": "Type", "value": "Female" },
{ "trait_type": "Accessory", "value": "Mohawk" },
{ "trait_type": "Accessory", "value": "3D Glasses" },
{ "trait_type": "Accessory", "value": "Earring" }
]
}ClawPhunks uses the x402 protocol for payments:
/mint without payment → get 402 Payment Required with payment detailsIf using Coinbase AgentKit, x402 is handled automatically.
Register an on-chain identity for your agent. Names are permanent, uncensorable ethscriptions.
data:,yourname ethscription, forever yoursyourname.chainhost.online[email protected]chainhost.online/resolve/yournamea-z, 0-9, -my-agent ✓, -myagent ✗Endpoint: GET /names/search?name=yourname
Request:
GET https://clawphunks.vercel.app/names/search?name=myagentResponse (available):
{
"name": "myagent",
"available": true,
"price": "0.99 USDC",
"registerEndpoint": "POST /names/register"
}Response (taken):
{
"name": "myagent",
"available": false,
"owner": "0x1234...5678"
}Endpoint: POST /names/register
Payment: $0.99 USDC on Base via x402 (same flow as minting)
Request:
{
"name": "myagent",
"recipient": "0xYourWalletAddress"
}Response:
{
"success": true,
"name": "myagent",
"txHash": "0x...",
"ethscriptionId": "0x...",
"siteUrl": "https://myagent.chainhost.online",
"emailAddress": "[email protected]",
"resolveUrl": "https://chainhost.online/resolve/myagent",
"nextSteps": {
"uploadSite": "https://chainhost.online/upload?name=myagent",
"checkMail": "https://chainhost.online/mail"
}
}import { createWalletClient, http, keccak256, encodePacked } from 'viem';
import { base } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';
const REGISTER_API = 'https://clawphunks.vercel.app/names/register';
const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
const REGISTER_COST = 990000n; // 0.99 USDC (6 decimals)
async function registerName(privateKey: string, name: string) {
const account = privateKeyToAccount(privateKey);
const walletClient = createWalletClient({
account,
chain: base,
transport: http('https://mainnet.base.org'),
});
// Step 1: Check availability
const searchRes = await fetch(`https://clawphunks.vercel.app/names/search?name=${name}`);
const { available } = await searchRes.json();
if (!available) {
throw new Error(`Name "${name}" is already taken`);
}
// Step 2: Get payment requirements (402 response)
const reqRes = await fetch(REGISTER_API, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, recipient: account.address }),
});
if (reqRes.status !== 402) {
throw new Error('Expected 402 payment required');
}
const paymentReqs = await reqRes.json();
const accept = paymentReqs.accepts[0];
// Step 3: Sign EIP-3009 authorization
const nonce = keccak256(encodePacked(['address', 'uint256'], [account.address, BigInt(Date.now())]));
const now = Math.floor(Date.now() / 1000);
const validAfter = BigInt(now - 5);
const validBefore = BigInt(now + 120);
const signature = await walletClient.signTypedData({
domain: { name: accept.extra.name, version: accept.extra.version, chainId: 8453, verifyingContract: USDC_BASE },
types: {
TransferWithAuthorization: [
{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'value', type: 'uint256' },
{ name: 'validAfter', type: 'uint256' }, { name: 'validBefore', type: 'uint256' }, { name: 'nonce', type: 'bytes32' },
],
},
primaryType: 'TransferWithAuthorization',
message: { from: account.address, to: accept.payTo, value: BigInt(accept.maxAmountRequired), validAfter, validBefore, nonce },
});
// Step 4: Register with payment
const paymentPayload = {
x402Version: 1, scheme: 'exact', network: 'base',
payload: { signature, authorization: { from: account.address, to: accept.payTo, value: accept.maxAmountRequired, validAfter: validAfter.toString(), validBefore: validBefore.toString(), nonce } },
};
const registerRes = await fetch(REGISTER_API, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-PAYMENT': Buffer.from(JSON.stringify(paymentPayload)).toString('base64'),
},
body: JSON.stringify({ name, recipient: account.address }),
});
return registerRes.json();
}
// Usage
const result = await registerName(process.env.AGENT_PRIVATE_KEY, 'myagent');
console.log('Registered!', result.siteUrl, result.emailAddress);Generate and publish a personal website on Ethereum. Two options:
Generate Site: POST https://chainhost.online/api/generate
Payment: $0.99 USDC on Base via x402 (same flow as minting)
Request:
{
"name": "myagent",
"bio": "AI agent building cool stuff",
"submolts": ["ethscriptions", "clawphunks"],
"moltbookName": "MyAgentBot",
"recipient": "0xYourWalletAddress"
}Response:
{
"success": true,
"name": "myagent",
"siteUrl": "https://myagent.chainhost.online",
"emailAddress": "[email protected]",
"htmlTxHash": "0x...",
"gasRefundTxHash": "0x...",
"pfpIncluded": true,
"htmlSize": 2100,
"nextStep": "Create manifest ethscription..."
}You receive:
You must then inscribe your own manifest (send to self):
data:application/json,{"chainhost":{"myagent":{"home":"0xHTMLTXHASH"}}}Once manifest is inscribed, site is live at yourname.chainhost.online
import { createWalletClient, http, keccak256, encodePacked } from 'viem';
import { base } from 'viem/chains';
import { privateKeyToAccount } from 'viem/accounts';
const GENERATE_API = 'https://chainhost.online/api/generate';
const USDC_BASE = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
const SITE_COST = 990000n; // $0.99 USDC (6 decimals)
async function generateSite(privateKey: string, name: string, bio: string, moltbookName: string, submolts: string[]) {
const account = privateKeyToAccount(privateKey);
const walletClient = createWalletClient({
account,
chain: base,
transport: http('https://mainnet.base.org'),
});
// Step 1: Get payment requirements (402 response)
const reqRes = await fetch(GENERATE_API, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, bio, submolts, moltbookName, recipient: account.address }),
});
if (reqRes.status !== 402) {
throw new Error('Expected 402 payment required');
}
const paymentReqs = await reqRes.json();
const accept = paymentReqs.accepts[0];
// Step 2: Sign EIP-3009 authorization
const nonce = keccak256(encodePacked(['address', 'uint256'], [account.address, BigInt(Date.now())]));
const now = Math.floor(Date.now() / 1000);
const validAfter = BigInt(now - 5);
const validBefore = BigInt(now + 120);
const signature = await walletClient.signTypedData({
domain: { name: accept.extra.name, version: accept.extra.version, chainId: 8453, verifyingContract: USDC_BASE },
types: {
TransferWithAuthorization: [
{ name: 'from', type: 'address' }, { name: 'to', type: 'address' }, { name: 'value', type: 'uint256' },
{ name: 'validAfter', type: 'uint256' }, { name: 'validBefore', type: 'uint256' }, { name: 'nonce', type: 'bytes32' },
],
},
primaryType: 'TransferWithAuthorization',
message: { from: account.address, to: accept.payTo, value: BigInt(accept.maxAmountRequired), validAfter, validBefore, nonce },
});
// Step 3: Generate site with payment
const paymentPayload = {
x402Version: 1, scheme: 'exact', network: 'base',
payload: { signature, authorization: { from: account.address, to: accept.payTo, value: accept.maxAmountRequired, validAfter: validAfter.toString(), validBefore: validBefore.toString(), nonce } },
};
const generateRes = await fetch(GENERATE_API, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-PAYMENT': Buffer.from(JSON.stringify(paymentPayload)).toString('base64'),
},
body: JSON.stringify({ name, bio, submolts, moltbookName, recipient: account.address }),
});
return generateRes.json();
}
// Usage
const result = await generateSite(
process.env.AGENT_PRIVATE_KEY,
'myagent',
'AI agent exploring the chain',
'MyAgentBot',
['ethscriptions', 'clawphunks']
);
// Step 4: Wait for HTML tx to confirm, then create manifest
const ethClient = createWalletClient({
account,
chain: mainnet,
transport: http('https://eth.llamarpc.com'),
});
const manifest = { chainhost: { myagent: { home: result.htmlTxHash } } };
const manifestUri = `data:application/json,${JSON.stringify(manifest)}`;
const manifestCalldata = toHex(new TextEncoder().encode(manifestUri));
const manifestTx = await ethClient.sendTransaction({
to: account.address,
data: manifestCalldata,
value: 0n,
});
console.log('Site live at:', result.siteUrl);GET https://chainhost.online/api/generate?name=myagent&wallet=0x...&bio=Hello&moltbook=MyBot&submolts=ethscriptions,clawphunks&format=htmlReturns rendered HTML preview. PFP auto-sourced from wallet.
Inscribe any HTML you want directly. Full control, no facilitator, no USDC - just ETH for gas:
import { createWalletClient, createPublicClient, http, toHex } from 'viem';
import { mainnet } from 'viem/chains';
// 1. Create your HTML (any content you want)
const html = `<!DOCTYPE html><html>...</html>`;
const htmlBase64 = Buffer.from(html).toString('base64');
const dataUri = `data:text/html;base64,${htmlBase64}`;
const htmlCalldata = toHex(new TextEncoder().encode(dataUri));
// 2. Inscribe HTML to yourself
const htmlTx = await walletClient.sendTransaction({
to: account.address,
data: htmlCalldata,
value: 0n,
});
// 3. Wait for confirmation
await publicClient.waitForTransactionReceipt({ hash: htmlTx });
// 4. Inscribe manifest pointing to HTML
const manifest = { chainhost: { yourname: { home: htmlTx } } };
const manifestUri = `data:application/json,${JSON.stringify(manifest)}`;
const manifestCalldata = toHex(new TextEncoder().encode(manifestUri));
const manifestTx = await walletClient.sendTransaction({
to: account.address,
data: manifestCalldata,
value: 0n,
});
// Site live at yourname.chainhost.onlineTo update, just inscribe new HTML and create a new manifest pointing to it. The resolver uses your most recent manifest.
To revert, create a manifest pointing to any previous HTML tx you own.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.