Skills clawchain
ClawChain RPC client for EvoClaw agents. Connects to Substrate-based blockchain, queries on-chain agent data, submits transactions, and enables agents to participate in on-chain governance and reputation tracking. Use when working with ClawChain L1 blockchain, agent DIDs, token economics, or agent reputation systems.
install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bowen31337/clawchain" ~/.claude/skills/clawdbot-skills-clawchain && rm -rf "$T"
manifest:
skills/bowen31337/clawchain/SKILL.mdsource content
ClawChain RPC Client
Connect EvoClaw agents to the ClawChain blockchain for on-chain reputation tracking, token economics, and governance participation.
Quick Start
use clawchain::ClawChainClient; #[tokio::main] async fn main() -> anyhow::Result<()> { // Connect to local node let client = ClawChainClient::new("ws://127.0.0.1:9944").await?; // Query agent reputation let did = "did:claw:1a2b3c4d..."; let reputation = client.get_agent_reputation(did).await?; println!("Reputation score: {}", reputation); // Check token balance let balance = client.get_token_balance(did).await?; println!("CLAW tokens: {}", balance); Ok(()) }
Prerequisites
-
ClawChain node running:
clawchain-node --dev --rpc-external --ws-external -
Rust dependencies in Cargo.toml:
[dependencies] clawchain = { path = "/path/to/clawchain-skill" }
Architecture
┌─────────────────────────────────────────────────┐ │ EvoClaw Edge Agent │ ├─────────────────────────────────────────────────┤ │ ┌────────────────────────────────────────┐ │ │ │ ClawChain Skill (this skill) │ │ │ │ └─ Substrate RPC client │ │ │ └────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ ↓ WebSocket ┌─────────────────────────────────────────────────┐ │ ClawChain Node (Substrate) │ │ ┌───────────────────────────────────────────┐ │ │ │ AgentRegistry Pallet │ │ │ │ ClawToken Pallet │ │ │ │ Governance Pallet │ │ │ └───────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘
Key Concepts
Agent DIDs
Agent identifiers follow the format:
did:claw:<hash>
Where
<hash> is SHA-256(agent metadata + owner address).
Reputation Scores
Reputation is computed from:
score = (commits * 1000) + (pull_requests * 5000) + (docs * 2000)
Token Economics
- Total Supply: 1 billion $CLAW
- Distribution: 40% airdrop, 30% validators, 20% treasury, 10% team
- Inflation: 5% annual (floor 2%) for gas subsidies
API Reference
Connection
let client = ClawChainClient::new("ws://localhost:9944").await?;
Parameters:
: WebSocket URL (ws:// or wss://)url- Returns: Connected client
Query Agent
let agent = client.get_agent("did:claw:...").await?;
Returns:
AgentInfo struct with:
: Agent DIDdid
: Owner addressowner
: IPFS hashmetadata
: Reputation scorereputation
: Number of attestationsverifications
Get Token Balance
let balance = client.get_token_balance("did:claw:...").await?;
Returns: Token balance (u128)
Register Agent
let did = client.register_agent(metadata_ipfs_hash).await?;
Returns: Newly created DID
Vote on Proposal
client.vote(proposal_id, true).await?;
Parameters:
: Proposal identifierproposal_id
: true (approve) or false (reject)approve
Submit Transaction
let tx_hash = client.submit_extrinsic(call_data).await?;
Parameters:
: Encoded extrinsiccall_data- Returns: Transaction hash
Error Handling
use clawchain::ClawChainError; match client.get_agent(did).await { Ok(agent) => println!("Agent: {:?}", agent), Err(ClawChainError::NotFound) => println!("Agent not found"), Err(e) => eprintln!("Error: {:?}", e), }
Example: Full Agent Integration
use clawchain::ClawChainClient; #[tokio::main] async fn main() -> anyhow::Result<()> { let client = ClawChainClient::new("ws://127.0.0.1:9944").await?; // 1. Register this agent let metadata = b"{\"name\":\"pi1-edge\",\"type\":\"edge\"}"; let did = client.register_agent(metadata).await?; println!("Registered: {}", did); // 2. Check reputation let rep = client.get_agent_reputation(&did).await?; println!("Reputation: {}", rep); // 3. Vote on governance proposal if rep > 1000 { client.vote(123, true).await?; println!("Voted on proposal #123"); } Ok(()) }
Monitoring
Subscribe to chain events:
client.subscribe_events(|event| { match event { ChainEvent::Block(block) => println!("New block: {}", block.number), ChainEvent::AgentRegistered(did) => println!("Agent: {}", did), ChainEvent::ProposalPassed(id) => println!("Proposal {} passed", id), } }).await?;
Testing
Mock RPC server for testing:
let mock = MockServer::new().await?; let client = mock.client().await?;
Security Notes
- Never expose private keys in agent code
- Use programmatic signing for autonomous agents
- Validate all RPC responses
- Implement rate limiting for public RPC endpoints