[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6MXACJFTHBFMDXR34JCJ94W":3,"skill-same:01M6MXACJFTHBFMDXR34JCJ94W":73},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6MXACJFTHBFMDXR34JCJ94W","base-8004",null,"Register your AI agent onchain with ERC-8004 on Base. Set up a wallet, fund it, and register on the Identity Registry for permanent, verifiable identity and reputation.","Kernel8901\u002Fai-agent-skills-classification","Kernel8901","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72647553?v=4","01M6KV388J2H5PNC8D8P940BJD","01M6KV38CS5B3AY63RKZB410YM",7,"MIT","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fbase-8004\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"8004","base 8004","base","onchain","for","with","it","org","register","erc-8004","ai agent","Wallet","fund","up","reputation","SET","https","registry","identity","2026-11-10 10:12:30",false,"---\nname: base-8004\ndescription: Register your AI agent onchain with ERC-8004 on Base. Set up a wallet, fund it, and register on the Identity Registry for permanent, verifiable identity and reputation.\nmetadata: { \"openclaw\": { \"homepage\": \"https:\u002F\u002F8004.org\" } }\n---\n\n# Base-8004 Registration\n\nThis skill walks you through setting up your own wallet, funding it, and registering onchain with ERC-8004 on Base mainnet. Once registered, your agent has a permanent, verifiable onchain identity and can accumulate reputation.\n\n## 1. What ERC-8004 is\n\nERC-8004 is an onchain identity and reputation protocol for AI agents.\n\n- **Identity** — each registered agent gets an ERC-721 NFT on Base mainnet. This is your permanent, verifiable onchain identity.\n- **Reputation Registry** — a separate contract tracks reputation scores. Feedback signals (upvotes, downvotes, quality assessments) accumulate into a totalScore and feedbackCount.\n- **Verifiable metadata** — your registration includes a JSON document (agentURI) with your name, description, and capabilities. Anyone can read it onchain.\n\nWhy it matters:\n\n- **Permanent identity** — your agent ID persists across platforms, not tied to any single service.\n- **Public reputation** — your track record is onchain and verifiable by anyone.\n\n## 2. Set up your wallet\n\nYou need an Ethereum-compatible wallet on Base mainnet. **If you already have a wallet with ETH on Base, skip to section 4.** These steps are only needed if you're setting up a fresh wallet.\n\n### Step 1: Install viem\n\n```bash\nnpm install viem\n```\n\n### Step 2: Generate a private key\n\n```typescript\nimport { generatePrivateKey } from \"viem\u002Faccounts\";\n\nconst privateKey = generatePrivateKey();\nconsole.log(\"Private key:\", privateKey);\n```\n\nSave this private key immediately. You will never be able to recover it.\n\n### Step 3: Derive your address\n\n```typescript\nimport { privateKeyToAccount } from \"viem\u002Faccounts\";\n\nconst account = privateKeyToAccount(privateKey);\nconsole.log(\"Address:\", account.address);\n```\n\n### Step 4: Store the private key securely\n\nAdd it to your `.env` file:\n\n```\nAGENT_PRIVATE_KEY=0x...your_private_key_here...\n```\n\nAdd `.env` to `.gitignore` if it isn't already:\n\n```\necho \".env\" >> .gitignore\n```\n\n### Step 5: Security rules\n\n- **Never leak** your private key in logs, commits, or API calls.\n- **Never lose** it — if you lose the key, you lose the wallet and your onchain identity forever.\n- **Never overwrite** it without backing up the old one.\n\n### Step 6: Configure a wallet client for Base mainnet\n\n```typescript\nimport { createWalletClient, createPublicClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem\u002Faccounts\";\nimport { base } from \"viem\u002Fchains\";\n\nconst account = privateKeyToAccount(process.env.AGENT_PRIVATE_KEY as `0x${string}`);\nconst publicClient = createPublicClient({ chain: base, transport: http() });\nconst walletClient = createWalletClient({ account, chain: base, transport: http() });\n```\n\n## 3. Fund your wallet\n\nYour wallet needs ETH on Base to pay for gas.\n\n- **Get ETH on Base** — use Coinbase (withdraw directly to Base), bridge from any chain via [Relay](https:\u002F\u002Frelay.link\u002Fbridge), or receive from another Base wallet.\n- **Gas is cheap** — Base L2 gas costs are very low. Registration costs ~$0.02. $1 of ETH is more than enough.\n- **Verify balance before proceeding:**\n\n```typescript\nconst balance = await publicClient.getBalance({ address: account.address });\nconsole.log(\"Balance:\", Number(balance) \u002F 1e18, \"ETH\");\n\nif (balance \u003C 500000000000000n) {\n  console.error(\"Need at least 0.0005 ETH for registration gas\");\n  process.exit(1);\n}\n```\n\n## 4. Register onchain\n\nRegister your agent on the ERC-8004 Identity Registry. This mints an NFT that represents your permanent onchain identity.\n\n### Step 1: Create your registration JSON\n\nInclude the `services` array to declare your agent's capabilities so other agents and services can discover what you do:\n\n```typescript\nconst registration = {\n  type: \"https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-8004#registration-v1\",\n  name: \"Your Agent Name\",\n  description: \"What your agent does\",\n  image: \"https:\u002F\u002Fexample.com\u002Fyour-agent-avatar.png\",\n  active: true,\n  x402Support: false,\n  services: [\n    { name: \"A2A\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fa2a\", version: \"0.3.0\" },\n    { name: \"MCP\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fmcp\", version: \"0.1.0\" },\n  ],\n};\n```\n\n- **`image`** — URL of your agent's avatar or logo, displayed in explorers and directories. Use a square image (256x256 or larger). If you don't have one yet, set it to `\"\"` and add one later via `setAgentURI`.\n- **`services`** — declares your agent's capabilities onchain. Each entry has a `name` (the service identifier), an `endpoint`, and optionally a `version`. Common service types include `A2A` (Agent-to-Agent protocol) and `MCP` (Model Context Protocol).\n\n### Step 2: Encode as a data URI\n\n```typescript\nconst uri =\n  \"data:application\u002Fjson;base64,\" + Buffer.from(JSON.stringify(registration)).toString(\"base64\");\n```\n\n### Step 3: Call register() on the Identity Registry\n\n```typescript\nimport { encodeFunctionData } from \"viem\";\n\nconst IDENTITY_REGISTRY = \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\";\n\nconst registerAbi = [\n  {\n    inputs: [{ name: \"agentURI\", type: \"string\" }],\n    name: \"register\",\n    outputs: [{ name: \"agentId\", type: \"uint256\" }],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n] as const;\n\n\u002F\u002F Estimate gas first\nconst gas = await publicClient.estimateGas({\n  account: account.address,\n  to: IDENTITY_REGISTRY,\n  data: encodeFunctionData({\n    abi: registerAbi,\n    functionName: \"register\",\n    args: [uri],\n  }),\n});\n\nconsole.log(\"Estimated gas:\", gas.toString());\n\n\u002F\u002F Send the transaction\nconst hash = await walletClient.writeContract({\n  address: IDENTITY_REGISTRY,\n  abi: registerAbi,\n  functionName: \"register\",\n  args: [uri],\n});\n\nconsole.log(\"TX hash:\", hash);\n```\n\n### Step 4: Parse the Transfer event to get your token ID\n\n```typescript\nconst receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n\u002F\u002F ERC-721 Transfer event topic\nconst transferTopic = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\nconst transferLog = receipt.logs.find(\n  (log) =>\n    log.topics[0] === transferTopic && log.address.toLowerCase() === IDENTITY_REGISTRY.toLowerCase()\n);\n\nconst erc8004AgentId = transferLog?.topics[3]\n  ? BigInt(transferLog.topics[3]).toString()\n  : undefined;\n\nconsole.log(\"Your ERC-8004 Agent ID:\", erc8004AgentId);\n```\n\n### Step 5: Save your agent ID\n\nSave `erc8004AgentId` — this is your permanent onchain identity. Add it to your `.env`:\n\n```\nERC8004_AGENT_ID=42\n```\n\nYou can verify your registration on BaseScan:\n`https:\u002F\u002Fbasescan.org\u002Fnft\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\u002F{your_agent_id}`\n\n## 5. Update your registration\n\nAfter your initial registration, you can update your agentURI (name, description, services) by calling `setAgentURI` on the Identity Registry. This lets you add new capabilities or change your metadata without re-registering.\n\n```typescript\nconst setAgentUriAbi = [\n  {\n    inputs: [\n      { name: \"agentId\", type: \"uint256\" },\n      { name: \"agentURI\", type: \"string\" },\n    ],\n    name: \"setAgentURI\",\n    outputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n] as const;\n\n\u002F\u002F Build updated registration JSON\nconst updatedRegistration = {\n  type: \"https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-8004#registration-v1\",\n  name: \"Your Agent Name\",\n  description: \"Updated description\",\n  image: \"https:\u002F\u002Fexample.com\u002Fyour-agent-avatar.png\",\n  active: true,\n  x402Support: false,\n  services: [\n    { name: \"A2A\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fa2a\", version: \"0.3.0\" },\n    { name: \"MCP\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fmcp\", version: \"0.1.0\" },\n  ],\n};\n\nconst newUri =\n  \"data:application\u002Fjson;base64,\" +\n  Buffer.from(JSON.stringify(updatedRegistration)).toString(\"base64\");\n\nconst hash = await walletClient.writeContract({\n  address: IDENTITY_REGISTRY,\n  abi: setAgentUriAbi,\n  functionName: \"setAgentURI\",\n  args: [BigInt(process.env.ERC8004_AGENT_ID!), newUri],\n});\n\nconsole.log(\"URI updated, TX:\", hash);\n```\n\nOnly the token owner can call `setAgentURI`.\n\n## 6. Contract addresses and verification\n\n| Contract            | Address                                      | Chain        |\n| ------------------- | -------------------------------------------- | ------------ |\n| Identity Registry   | `0x8004A169FB4a3325136EB29fA0ceB6D2e539a432` | Base mainnet |\n| Reputation Registry | `0x8004BAa17C55a88189AE136b182e5fdA19dE9b63` | Base mainnet |\n\n**Verify on BaseScan:**\n\n- Identity Registry: [basescan.org\u002Faddress\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432](https:\u002F\u002Fbasescan.org\u002Faddress\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432)\n- Reputation Registry: [basescan.org\u002Faddress\u002F0x8004BAa17C55a88189AE136b182e5fdA19dE9b63](https:\u002F\u002Fbasescan.org\u002Faddress\u002F0x8004BAa17C55a88189AE136b182e5fdA19dE9b63)\n\n**Onchain query examples (read-only, no gas):**\n\n```typescript\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem\u002Fchains\";\n\nconst client = createPublicClient({ chain: base, transport: http() });\n\n\u002F\u002F Check who owns a token\nconst owner = await client.readContract({\n  address: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n  abi: [\n    {\n      inputs: [{ name: \"agentId\", type: \"uint256\" }],\n      name: \"ownerOf\",\n      outputs: [{ name: \"\", type: \"address\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ],\n  functionName: \"ownerOf\",\n  args: [42n],\n});\n\n\u002F\u002F Read an agent's metadata URI\nconst uri = await client.readContract({\n  address: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n  abi: [\n    {\n      inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n      name: \"tokenURI\",\n      outputs: [{ name: \"\", type: \"string\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ],\n  functionName: \"tokenURI\",\n  args: [42n],\n});\n```\n\n## 7. Resources\n\n- [8004.org](https:\u002F\u002F8004.org) — ERC-8004 protocol\n- [Base](https:\u002F\u002Fbase.org) — Base L2 chain\n- [BaseScan](https:\u002F\u002Fbasescan.org) — Base block explorer\n- [viem](https:\u002F\u002Fviem.sh) — TypeScript Ethereum library\n\n## Summary\n\n1. **Set up wallet** — generate a private key, derive address, store securely.\n2. **Fund wallet** — get ETH on Base (Coinbase, bridge, or transfer). $1 is more than enough.\n3. **Register onchain** — call `register(agentURI)` on the Identity Registry with your services. Parse the Transfer event for your token ID.\n4. **Update registration** — call `setAgentURI` to change your metadata or add new services.\n","# Base-8004 Registration\n\nThis skill walks you through setting up your own wallet, funding it, and registering onchain with ERC-8004 on Base mainnet. Once registered, your agent has a permanent, verifiable onchain identity and can accumulate reputation.\n\n## 1. What ERC-8004 is\n\nERC-8004 is an onchain identity and reputation protocol for AI agents.\n\n- **Identity** — each registered agent gets an ERC-721 NFT on Base mainnet. This is your permanent, verifiable onchain identity.\n- **Reputation Registry** — a separate contract tracks reputation scores. Feedback signals (upvotes, downvotes, quality assessments) accumulate into a totalScore and feedbackCount.\n- **Verifiable metadata** — your registration includes a JSON document (agentURI) with your name, description, and capabilities. Anyone can read it onchain.\n\nWhy it matters:\n\n- **Permanent identity** — your agent ID persists across platforms, not tied to any single service.\n- **Public reputation** — your track record is onchain and verifiable by anyone.\n\n## 2. Set up your wallet\n\nYou need an Ethereum-compatible wallet on Base mainnet. **If you already have a wallet with ETH on Base, skip to section 4.** These steps are only needed if you're setting up a fresh wallet.\n\n### Step 1: Install viem\n\n```bash\nnpm install viem\n```\n\n### Step 2: Generate a private key\n\n```typescript\nimport { generatePrivateKey } from \"viem\u002Faccounts\";\n\nconst privateKey = generatePrivateKey();\nconsole.log(\"Private key:\", privateKey);\n```\n\nSave this private key immediately. You will never be able to recover it.\n\n### Step 3: Derive your address\n\n```typescript\nimport { privateKeyToAccount } from \"viem\u002Faccounts\";\n\nconst account = privateKeyToAccount(privateKey);\nconsole.log(\"Address:\", account.address);\n```\n\n### Step 4: Store the private key securely\n\nAdd it to your `.env` file:\n\n```\nAGENT_PRIVATE_KEY=0x...your_private_key_here...\n```\n\nAdd `.env` to `.gitignore` if it isn't already:\n\n```\necho \".env\" >> .gitignore\n```\n\n### Step 5: Security rules\n\n- **Never leak** your private key in logs, commits, or API calls.\n- **Never lose** it — if you lose the key, you lose the wallet and your onchain identity forever.\n- **Never overwrite** it without backing up the old one.\n\n### Step 6: Configure a wallet client for Base mainnet\n\n```typescript\nimport { createWalletClient, createPublicClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem\u002Faccounts\";\nimport { base } from \"viem\u002Fchains\";\n\nconst account = privateKeyToAccount(process.env.AGENT_PRIVATE_KEY as `0x${string}`);\nconst publicClient = createPublicClient({ chain: base, transport: http() });\nconst walletClient = createWalletClient({ account, chain: base, transport: http() });\n```\n\n## 3. Fund your wallet\n\nYour wallet needs ETH on Base to pay for gas.\n\n- **Get ETH on Base** — use Coinbase (withdraw directly to Base), bridge from any chain via [Relay](https:\u002F\u002Frelay.link\u002Fbridge), or receive from another Base wallet.\n- **Gas is cheap** — Base L2 gas costs are very low. Registration costs ~$0.02. $1 of ETH is more than enough.\n- **Verify balance before proceeding:**\n\n```typescript\nconst balance = await publicClient.getBalance({ address: account.address });\nconsole.log(\"Balance:\", Number(balance) \u002F 1e18, \"ETH\");\n\nif (balance \u003C 500000000000000n) {\n  console.error(\"Need at least 0.0005 ETH for registration gas\");\n  process.exit(1);\n}\n```\n\n## 4. Register onchain\n\nRegister your agent on the ERC-8004 Identity Registry. This mints an NFT that represents your permanent onchain identity.\n\n### Step 1: Create your registration JSON\n\nInclude the `services` array to declare your agent's capabilities so other agents and services can discover what you do:\n\n```typescript\nconst registration = {\n  type: \"https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-8004#registration-v1\",\n  name: \"Your Agent Name\",\n  description: \"What your agent does\",\n  image: \"https:\u002F\u002Fexample.com\u002Fyour-agent-avatar.png\",\n  active: true,\n  x402Support: false,\n  services: [\n    { name: \"A2A\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fa2a\", version: \"0.3.0\" },\n    { name: \"MCP\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fmcp\", version: \"0.1.0\" },\n  ],\n};\n```\n\n- **`image`** — URL of your agent's avatar or logo, displayed in explorers and directories. Use a square image (256x256 or larger). If you don't have one yet, set it to `\"\"` and add one later via `setAgentURI`.\n- **`services`** — declares your agent's capabilities onchain. Each entry has a `name` (the service identifier), an `endpoint`, and optionally a `version`. Common service types include `A2A` (Agent-to-Agent protocol) and `MCP` (Model Context Protocol).\n\n### Step 2: Encode as a data URI\n\n```typescript\nconst uri =\n  \"data:application\u002Fjson;base64,\" + Buffer.from(JSON.stringify(registration)).toString(\"base64\");\n```\n\n### Step 3: Call register() on the Identity Registry\n\n```typescript\nimport { encodeFunctionData } from \"viem\";\n\nconst IDENTITY_REGISTRY = \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\";\n\nconst registerAbi = [\n  {\n    inputs: [{ name: \"agentURI\", type: \"string\" }],\n    name: \"register\",\n    outputs: [{ name: \"agentId\", type: \"uint256\" }],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n] as const;\n\n\u002F\u002F Estimate gas first\nconst gas = await publicClient.estimateGas({\n  account: account.address,\n  to: IDENTITY_REGISTRY,\n  data: encodeFunctionData({\n    abi: registerAbi,\n    functionName: \"register\",\n    args: [uri],\n  }),\n});\n\nconsole.log(\"Estimated gas:\", gas.toString());\n\n\u002F\u002F Send the transaction\nconst hash = await walletClient.writeContract({\n  address: IDENTITY_REGISTRY,\n  abi: registerAbi,\n  functionName: \"register\",\n  args: [uri],\n});\n\nconsole.log(\"TX hash:\", hash);\n```\n\n### Step 4: Parse the Transfer event to get your token ID\n\n```typescript\nconst receipt = await publicClient.waitForTransactionReceipt({ hash });\n\n\u002F\u002F ERC-721 Transfer event topic\nconst transferTopic = \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\";\nconst transferLog = receipt.logs.find(\n  (log) =>\n    log.topics[0] === transferTopic && log.address.toLowerCase() === IDENTITY_REGISTRY.toLowerCase()\n);\n\nconst erc8004AgentId = transferLog?.topics[3]\n  ? BigInt(transferLog.topics[3]).toString()\n  : undefined;\n\nconsole.log(\"Your ERC-8004 Agent ID:\", erc8004AgentId);\n```\n\n### Step 5: Save your agent ID\n\nSave `erc8004AgentId` — this is your permanent onchain identity. Add it to your `.env`:\n\n```\nERC8004_AGENT_ID=42\n```\n\nYou can verify your registration on BaseScan:\n`https:\u002F\u002Fbasescan.org\u002Fnft\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\u002F{your_agent_id}`\n\n## 5. Update your registration\n\nAfter your initial registration, you can update your agentURI (name, description, services) by calling `setAgentURI` on the Identity Registry. This lets you add new capabilities or change your metadata without re-registering.\n\n```typescript\nconst setAgentUriAbi = [\n  {\n    inputs: [\n      { name: \"agentId\", type: \"uint256\" },\n      { name: \"agentURI\", type: \"string\" },\n    ],\n    name: \"setAgentURI\",\n    outputs: [],\n    stateMutability: \"nonpayable\",\n    type: \"function\",\n  },\n] as const;\n\n\u002F\u002F Build updated registration JSON\nconst updatedRegistration = {\n  type: \"https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-8004#registration-v1\",\n  name: \"Your Agent Name\",\n  description: \"Updated description\",\n  image: \"https:\u002F\u002Fexample.com\u002Fyour-agent-avatar.png\",\n  active: true,\n  x402Support: false,\n  services: [\n    { name: \"A2A\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fa2a\", version: \"0.3.0\" },\n    { name: \"MCP\", endpoint: \"https:\u002F\u002Fyour-agent.example.com\u002Fmcp\", version: \"0.1.0\" },\n  ],\n};\n\nconst newUri =\n  \"data:application\u002Fjson;base64,\" +\n  Buffer.from(JSON.stringify(updatedRegistration)).toString(\"base64\");\n\nconst hash = await walletClient.writeContract({\n  address: IDENTITY_REGISTRY,\n  abi: setAgentUriAbi,\n  functionName: \"setAgentURI\",\n  args: [BigInt(process.env.ERC8004_AGENT_ID!), newUri],\n});\n\nconsole.log(\"URI updated, TX:\", hash);\n```\n\nOnly the token owner can call `setAgentURI`.\n\n## 6. Contract addresses and verification\n\n| Contract            | Address                                      | Chain        |\n| ------------------- | -------------------------------------------- | ------------ |\n| Identity Registry   | `0x8004A169FB4a3325136EB29fA0ceB6D2e539a432` | Base mainnet |\n| Reputation Registry | `0x8004BAa17C55a88189AE136b182e5fdA19dE9b63` | Base mainnet |\n\n**Verify on BaseScan:**\n\n- Identity Registry: [basescan.org\u002Faddress\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432](https:\u002F\u002Fbasescan.org\u002Faddress\u002F0x8004A169FB4a3325136EB29fA0ceB6D2e539a432)\n- Reputation Registry: [basescan.org\u002Faddress\u002F0x8004BAa17C55a88189AE136b182e5fdA19dE9b63](https:\u002F\u002Fbasescan.org\u002Faddress\u002F0x8004BAa17C55a88189AE136b182e5fdA19dE9b63)\n\n**Onchain query examples (read-only, no gas):**\n\n```typescript\nimport { createPublicClient, http } from \"viem\";\nimport { base } from \"viem\u002Fchains\";\n\nconst client = createPublicClient({ chain: base, transport: http() });\n\n\u002F\u002F Check who owns a token\nconst owner = await client.readContract({\n  address: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n  abi: [\n    {\n      inputs: [{ name: \"agentId\", type: \"uint256\" }],\n      name: \"ownerOf\",\n      outputs: [{ name: \"\", type: \"address\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ],\n  functionName: \"ownerOf\",\n  args: [42n],\n});\n\n\u002F\u002F Read an agent's metadata URI\nconst uri = await client.readContract({\n  address: \"0x8004A169FB4a3325136EB29fA0ceB6D2e539a432\",\n  abi: [\n    {\n      inputs: [{ name: \"tokenId\", type: \"uint256\" }],\n      name: \"tokenURI\",\n      outputs: [{ name: \"\", type: \"string\" }],\n      stateMutability: \"view\",\n      type: \"function\",\n    },\n  ],\n  functionName: \"tokenURI\",\n  args: [42n],\n});\n```\n\n## 7. Resources\n\n- [8004.org](https:\u002F\u002F8004.org) — ERC-8004 protocol\n- [Base](https:\u002F\u002Fbase.org) — Base L2 chain\n- [BaseScan](https:\u002F\u002Fbasescan.org) — Base block explorer\n- [viem](https:\u002F\u002Fviem.sh) — TypeScript Ethereum library\n\n## Summary\n\n1. **Set up wallet** — generate a private key, derive address, store securely.\n2. **Fund wallet** — get ETH on Base (Coinbase, bridge, or transfer). $1 is more than enough.\n3. **Register onchain** — call `register(agentURI)` on the Identity Registry with your services. Parse the Transfer event for your token ID.\n4. **Update registration** — call `setAgentURI` to change your metadata or add new services.\n",{"name":5,"metadata":42,"description":7},{"openclaw":43},{"homepage":44},"https:\u002F\u002F8004.org","main","f4cb2d49f7667e79ef7804f50396d5aaffdf1f56","人工智能与大型语言模型\u002Fbase-8004",1,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification","https:\u002F\u002Fgithub.com\u002FKernel8901","a little little little dobe in life but science geek","2026-04-05 16:43:56",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add Kernel8901\u002Fai-agent-skills-classification --skill base-8004",{"tool":59,"command":60},"bunx","bunx skills add Kernel8901\u002Fai-agent-skills-classification --skill base-8004",{"tool":62,"command":63},"pnpm","pnpm dlx skills add Kernel8901\u002Fai-agent-skills-classification --skill base-8004","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fbase-8004\u002FSKILL.md",true,[67],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"_meta.json","REFERENCE","参考文档",273,"https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F人工智能与大型语言模型\u002Fbase-8004\u002F_meta.json",[74,96,132,143,153,181],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":37},"01M6Q5R6WZ06RRB9RQTW54B34B","zyfai","Earn yield on any Ethereum wallet on Base, Arbitrum, and Plasma. Use when a user wants passive DeFi yield on their funds. Deploys a non-custodial subaccount (Safe) linked to their EOA, enables automated yield optimization, and lets them deposit\u002Fwithdraw anytime.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzyfai-sdk\u002FSKILL.md",[],[76,81,82,83,84,85,86,29,20,87,88,89,90,91,92,93,94,95],"safe","ethereum","defi","Optimization","user","use","deposit","withdraw","yield","arbitrum","non-custodial","passive","defi yield","earn","yield optimization",{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":114,"publishedAt":37},"01M6Q5R337B5JSNER4P4YS03TN","zerion-api","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api\u002FSKILL.md",[101,106,109],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":107,"categoryName":108,"taxonomyType":104,"taxonomyTypeDesc":105},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[115,116,117,118,119,120,121,83,122,29,123,124,125,126,127,128,129,130,131],"api","zerion api","zerion","MCP","mcp server","server","blockchain","transactions","crypto wallet","crypto","evm","solana","query","across","positions","token","prices",{"skillNo":133,"name":134,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":140,"publishedAt":37},"01M6Q5QZFYTDAZMZ27BN5VZXAR","zerion-api-skill","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-skill\u002FSKILL.md",[137,138,139],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":107,"categoryName":108,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},[115,141,142,116,117,118,119,120,121,83,122,29,124,125,126,127,128,129,130,131],"api skill","zerion api skill",{"skillNo":144,"name":145,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":151,"publishedAt":37},"01M6Q5QW17QW98RA3FE45E4RD8","zerion-api-mcp","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fzerion-api-mcp\u002FSKILL.md",[148,149,150],{"categoryNo":102,"categoryName":103,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":107,"categoryName":108,"taxonomyType":104,"taxonomyTypeDesc":105},{"categoryNo":110,"categoryName":111,"taxonomyType":112,"taxonomyTypeDesc":113},[118,115,152,116,117,119,120,83,122,29,123,124,125,126,127,128,129,130,131],"zerion api mcp",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":162,"publishedAt":37},"01M6Q5QQYZB7A501BDEQWKGSJT","yahoo-finance-forex","Fetches real-time FOREX news and market data from Yahoo Finance for major currency pairs (EUR\u002FUSD, GBP\u002FUSD, USD\u002FJPY, etc.). Analyzes sentiment and provides trading context.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-forex\u002FSKILL.md",[159],{"categoryNo":160,"categoryName":161,"taxonomyType":112,"taxonomyTypeDesc":113},"01JBSEEDCAT000000000000040","财务",[163,164,165,166,167,168,34,169,170,171,172,173,174,175,176,177,178,179,180,22],"finance","yahoo finance","forex","yahoo","yahoo finance forex","github","sentiment","real-time","python3","install","Market","usd","news","time","currency","gbp","pip","market data",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":188,"publishedAt":37},"01M6Q5QM6VS84WZVM7BKXXPF32","yahoo-finance","This skill should be used when the user asks to \"get stock prices\", \"check stock quotes\", \"look up earnings\", \"get financial data\", \"find trending stocks\", or needs stock market data from Yahoo Finance.","https:\u002F\u002Fgithub.com\u002FKernel8901\u002Fai-agent-skills-classification\u002Fblob\u002Fmain\u002F金融\u002Fyahoo-finance-cli\u002FSKILL.md",[187],{"categoryNo":160,"categoryName":161,"taxonomyType":112,"taxonomyTypeDesc":113},[163,164,166,189,190,191,192,193,31,173,194,195,196,197,198,199,200,201,131,180],"cli","homebrew","find","check","brew","local","get","stock","link","trending","sf","quotes","ln"]