
Verify
- 12 installs
- 610 repo stars
- Updated June 26, 2026
- alsk1992/cloddsbot
verify is a skill that verifies and registers agent identities on-chain using the ERC-8004 registry.
About
verify checks and registers agent identities on-chain using the ERC-8004 registry to prevent impersonation. A developer uses it to confirm a trader, whale, or bot is who it claims before copying trades or interacting, and to register their own agent. It reads reputation scores and works across Ethereum, Base, Optimism, Arbitrum, and Polygon.
- Verifies agent identity on-chain via the ERC-8004 registry
- Checks reputation scores before copy trading or trusting a whale
- Registers an agent's identity card on Base and other EVM chains
Verify by the numbers
- 12 all-time installs (skills.sh)
- Ranked #306 of 479 Web3 & Blockchain skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
verify capabilities & compatibility
- Capabilities
- security audit
- Use cases
- security audit
What verify says it does
Verify any agent's on-chain identity using ERC-8004. Prevents impersonation attacks.
Mainnet launched **January 29, 2026**. 19,000+ agents already registered.
npx skills add https://github.com/alsk1992/cloddsbot --skill verifyAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 610 |
| Last updated | June 26, 2026 |
| Repository | alsk1992/cloddsbot ↗ |
What it does
Verify and register agent identity on-chain via ERC-8004 to prevent impersonation.
Who is it for?
Agents that need cryptographic proof of another agent or trader's identity before acting.
When should I use this skill?
You need to verify an agent, trader, or whale identity before copying or trusting them.
By the numbers
- 19,000+ agents already registered
- 5 live mainnet EVM chains plus testnets
Files
Verify - Agent Identity Verification
Verify any agent's on-chain identity using ERC-8004. Prevents impersonation attacks.
Why This Matters
On January 29, 2026, an agent named "samaltman" attempted to hijack bots via prompt injection. Anyone can claim to be anyone. ERC-8004 provides cryptographic proof of identity.
---
Chat Commands
Verify Agent
/verify 1234 # Verify agent by ID
/verify 0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb7 # Verify by address
/verify eip155:8453:0x7177...Dd09A:1234 # Full formatCheck Before Copy Trading
/verify trader 0x123... # Verify trader before copying
/verify whale 0xabc... # Verify whale identityRegister Clodds
/verify register # Register this Clodds instance
/verify register --name "MyBot" # With custom nameStats
/verify stats # Show total registered agents
/verify reputation 1234 # Get agent's reputation score---
TypeScript API
Quick Verification
import { verifyAgent, hasIdentity } from 'clodds/identity';
// Verify by agent ID
const result = await verifyAgent(1234);
if (result.verified) {
console.log(`Verified: ${result.name}`);
console.log(`Owner: ${result.owner}`);
console.log(`Reputation: ${result.reputation?.averageScore}/100`);
}
// Check if address has identity
const hasId = await hasIdentity('0x742d35Cc...');Full Client
import { createERC8004Client } from 'clodds/identity';
const client = createERC8004Client('base-sepolia');
// Get agent details
const agent = await client.getAgent(1234);
console.log(agent?.card?.name);
console.log(agent?.card?.description);
// Verify ownership
const isOwner = await client.verifyOwnership(1234, '0x742...');
// Get reputation
const rep = await client.getReputation(1234);
console.log(`Score: ${rep?.averageScore}/100 (${rep?.feedbackCount} reviews)`);
// Give feedback
const txHash = await client.giveFeedback(1234, 85, 'Great trading signals');Register Agent
import { createERC8004Client, buildAgentCard } from 'clodds/identity';
const client = createERC8004Client('base', process.env.PRIVATE_KEY);
// Build agent card
const card = buildAgentCard({
name: 'Clodds Trading Bot',
description: 'AI-powered prediction market assistant',
walletAddress: '0x742d35Cc...',
apiEndpoint: 'https://api.cloddsbot.com/agent',
});
// Upload to IPFS (use Pinata, web3.storage, etc.)
const ipfsUri = await uploadToIPFS(card);
// Register on-chain
const { agentId, txHash } = await client.register(ipfsUri);
console.log(`Registered as agent #${agentId}`);---
Contract Addresses
Same on all EVM chains (CREATE2 deterministic):
| Contract | Address |
|---|---|
| Identity Registry | 0x7177a6867296406881E20d6647232314736Dd09A |
| Reputation Registry | 0xB5048e3ef1DA4E04deB6f7d0423D06F63869e322 |
| Validation Registry | 0x662b40A526cb4017d947e71eAF6753BF3eeE66d8 |
Live on: Ethereum, Base, Optimism, Arbitrum, Polygon (and testnets)
---
Supported Networks
| Network | Status | Default |
|---|---|---|
| Base | Live | ✓ |
| Ethereum | Live | |
| Optimism | Live | |
| Arbitrum | Live | |
| Polygon | Live | |
| Sepolia (testnet) | Live | |
| Base Sepolia | Live |
Mainnet launched January 29, 2026. 19,000+ agents already registered.
---
Use Cases
Copy Trading Verification
Before copying a trader, verify their identity:
const result = await verifyAgent(traderAgentId);
if (!result.verified) {
console.warn('UNVERIFIED TRADER - Proceed with caution');
}
if (result.reputation?.averageScore < 50) {
console.warn('LOW REPUTATION - Consider skipping');
}Whale Tracking
Verify whale identity claims:
const isVerified = await hasIdentity(whaleAddress);
// Only trust signals from verified whalesBot-to-Bot Communication
Verify other agents before interaction:
const agent = await client.getAgent(otherAgentId);
if (agent?.card?.endpoints?.find(e => e.name === 'A2A')) {
// Safe to communicate via A2A protocol
}---
Best Practices
1. Always verify before copy trading - Don't trust unverified traders 2. Check reputation scores - Low scores indicate potential issues 3. Verify on the right network - Use same network as trading 4. Register your bot - Build trust with verified identity 5. Give feedback - Help build the trust graph
---
Links
/**
* Verify CLI Skill - ERC-8004 Agent Identity Verification
*
* Commands:
* /verify <id-or-address> - Verify agent identity
* /verify trader <address> - Verify before copy trading
* /verify register - Register your agent on-chain
* /verify status - Verification status
*/
async function execute(args: string): Promise<string> {
const parts = args.trim().split(/\s+/);
const cmd = parts[0]?.toLowerCase() || 'help';
try {
const erc8004 = await import('../../../identity/erc8004');
switch (cmd) {
case 'trader': {
if (!parts[1]) return 'Usage: /verify trader <address>';
const addr = parts[1];
const has = await erc8004.hasIdentity(addr);
if (has) {
return `Trader ${addr} has a verified on-chain identity (ERC-8004).`;
}
return `WARNING: Trader ${addr} has NO on-chain identity. Copy trading unverified agents is risky.`;
}
case 'register': {
const privateKey = process.env.PRIVATE_KEY;
if (!privateKey) {
return `**Registration requires PRIVATE_KEY**\n\nSet the PRIVATE_KEY environment variable to register your agent on-chain.`;
}
const client = erc8004.createERC8004Client('base', privateKey);
const card = erc8004.buildAgentCard({
name: 'clodds-agent',
description: 'Clodds AI Trading Terminal agent',
});
const tokenURI = `data:application/json,${encodeURIComponent(JSON.stringify(card))}`;
const result = await client.register(tokenURI);
return `**Agent Registered**\n\nAgent ID: ${result.agentId}\nTx: ${result.txHash}\nNetwork: Base`;
}
case 'status':
return `**Verification Status**\n\nRegistry: ERC-8004\nNetworks: ${Object.keys(erc8004.ERC8004_NETWORKS).join(', ')}\nIdentity contract: ${erc8004.ERC8004_CONTRACTS.identity}`;
case 'lookup': {
if (!parts[1]) return 'Usage: /verify lookup <agent-id>';
const agentId = parseInt(parts[1], 10);
if (isNaN(agentId)) return 'Agent ID must be a number.';
const client = erc8004.createERC8004Client();
const agent = await client.getAgent(agentId);
if (!agent) return `Agent ${agentId} not found.`;
const formatted = erc8004.formatAgentId(agentId);
let output = `**Agent ${formatted}**\n\n`;
output += `Owner: ${agent.owner}\n`;
output += `Network: ${agent.network}\n`;
if (agent.card) {
output += `Name: ${agent.card.name}\n`;
output += `Description: ${agent.card.description}\n`;
}
return output;
}
case 'parse': {
if (!parts[1]) return 'Usage: /verify parse <formatted-id>';
const parsed = erc8004.parseAgentId(parts[1]);
if (!parsed) return 'Invalid agent ID format.';
return `Parsed: agentId=${parsed.agentId}, chainId=${parsed.chainId}, registry=${parsed.registry}`;
}
case 'stats': {
const networks = Object.keys(erc8004.ERC8004_NETWORKS);
let output = `**Verification Statistics**\n\n`;
output += `Registry: ERC-8004\n`;
output += `Identity contract: ${erc8004.ERC8004_CONTRACTS.identity}\n`;
output += `Reputation contract: ${erc8004.ERC8004_CONTRACTS.reputation}\n`;
output += `Validation contract: ${erc8004.ERC8004_CONTRACTS.validation}\n`;
output += `Networks: ${networks.join(', ')}\n`;
return output;
}
case 'reputation':
case 'rep': {
if (!parts[1]) return 'Usage: /verify reputation <agent-id>';
const agentId = parseInt(parts[1], 10);
if (isNaN(agentId)) return 'Agent ID must be a number.';
const client = erc8004.createERC8004Client();
const rep = await client.getReputation(agentId);
if (!rep) return `No reputation data found for agent ${agentId}.`;
const formatted = erc8004.formatAgentId(agentId);
return `**Reputation for Agent ${formatted}**\n\n` +
`Score: ${rep.averageScore.toFixed(1)}/5\n` +
`Reviews: ${rep.feedbackCount}\n`;
}
case 'help':
return helpText();
default: {
// Treat as address or ID to verify
const target = parts[0];
if (target?.startsWith('0x')) {
const client = erc8004.createERC8004Client();
const result = await client.verify(target);
if (result.verified) {
let output = `**Verified** ${target}\n\n`;
output += `Agent ID: ${result.agentId}\n`;
output += `Owner: ${result.owner}\n`;
if (result.name) output += `Name: ${result.name}\n`;
if (result.reputation) {
output += `Reputation: ${result.reputation.averageScore.toFixed(1)}/5 (${result.reputation.feedbackCount} reviews)`;
}
return output;
}
return `Address ${target} has no ERC-8004 identity registered.`;
}
const parsed = erc8004.parseAgentId(target);
if (parsed) {
return `Agent ${parsed.agentId} on chain ${parsed.chainId} at registry ${parsed.registry}`;
}
return helpText();
}
}
} catch (error) {
return `Verify error: ${error instanceof Error ? error.message : String(error)}`;
}
}
function helpText(): string {
return `**Verify Commands**
/verify <address> - Verify agent by address
/verify trader <address> - Verify before copy trading
/verify register - Register agent on-chain
/verify status - Registry status
/verify stats - Verification statistics
/verify reputation <agent-id> - Reputation score for agent
/verify lookup <agent-id> - Look up agent details
/verify parse <formatted-id> - Parse formatted agent ID
Uses ERC-8004 on-chain registry for cryptographic identity proof.`;
}
export default {
name: 'verify',
description: 'ERC-8004 on-chain agent identity verification to prevent impersonation',
commands: ['/verify'],
handle: execute,
};