internal/embed/skills/ethereum-networks/SKILL.md
Query Ethereum networks through the local RPC gateway. Use when asked about blocks, balances, transactions, gas prices, token balances, or any eth_* JSON-RPC method. All queries are read-only and routed through the in-cluster eRPC load balancer.
npx skillsauth add obolnetwork/obol-stack ethereum-networksInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Query Ethereum blockchain data through the local eRPC gateway. Supports any JSON-RPC method, multiple networks, and ERC-20 token lookups.
eth_*, net_*, or web3_* methodethereum-local-walletdistributed-validatorsobol-stackThe eRPC gateway routes to whichever Ethereum networks are installed:
http://erpc.erpc.svc.cluster.local/rpc/{network}
mainnet is always available. Other networks (e.g. hoodi) are available if installed. You can also use evm/{chainId} (e.g. evm/560048 for Hoodi).
To see which networks are connected:
curl -s http://erpc.erpc.svc.cluster.local/ | python3 -m json.tool
When a signed tx is broadcast (via ethereum-local-wallet's send-tx, or
directly via eth_sendRawTransaction), eRPC pins the call to Obol's protected
upstream — obol-rpc-mainnet for chain 1, obol-rpc-base for chain 8453. Read
methods still fan out across all configured upstreams; only writes are pinned.
Two consequences worth knowing:
If a tx you broadcast never lands and eth_getTransactionByHash keeps returning
null, simulate before retrying — bumping gas or nonce won't help when the
upstream is filtering on simulation outcome:
# Dry-run the call against current state with the same args you'd send
sh scripts/rpc.sh call <to> "<sig>" <args...>
# Or estimate gas — also reverts when the call would revert
sh scripts/rpc.sh estimate <to> "<sig>" <args...>
If either reverts, fix the inputs (allowance, deadline, slippage, etc.) before re-broadcasting.
Prefer rpc.sh (uses Foundry's cast) — it handles ABI decoding, unit conversion, and ENS natively:
# ETH balance (in ether)
sh scripts/rpc.sh balance 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# Block details
sh scripts/rpc.sh block latest
# Transaction lookup
sh scripts/rpc.sh tx 0x<hash>
# Transaction receipt
sh scripts/rpc.sh receipt 0x<hash>
# Contract read with ABI decoding
sh scripts/rpc.sh call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 "totalSupply()(uint256)"
# Gas price and base fee
sh scripts/rpc.sh gas-price
sh scripts/rpc.sh base-fee
# Nonce
sh scripts/rpc.sh nonce 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# Different network
sh scripts/rpc.sh --network hoodi block latest
# ENS resolution
sh scripts/rpc.sh ens vitalik.eth
# Unit conversion
sh scripts/rpc.sh from-wei 1000000000000000000
sh scripts/rpc.sh to-wei 1.5
# Decode a function selector
sh scripts/rpc.sh 4byte 0xa9059cbb
# Decode ABI-encoded return data
sh scripts/rpc.sh abi-decode "balanceOf(address)(uint256)" 0x00000000000000000000000000000000000000000000000000000000000f4240
# Raw JSON-RPC method
sh scripts/rpc.sh raw eth_blockNumber
| Command | Params | Description |
|---------|--------|-------------|
| balance | address | ETH balance in ether |
| block | [number\|latest] | Block details |
| tx | hash | Transaction details |
| receipt | hash | Transaction receipt with logs |
| call | to sig [args...] | Contract read with ABI decoding |
| estimate | to sig [args...] | Gas estimate for a call |
| chain-id | none | Chain ID |
| gas-price | none | Current gas price in wei |
| base-fee | none | Current base fee |
| nonce | address | Transaction count |
| code | address | Contract bytecode |
| ens | name | Resolve ENS name to address |
| from-wei | value [unit] | Convert from wei |
| to-wei | value [unit] | Convert to wei |
| 4byte | selector | Decode 4-byte function selector |
| abi-decode | sig data | Decode ABI-encoded data |
| logs | address [topic0] [--from-block N] | Query event logs |
| raw | method [params...] | Raw JSON-RPC call |
With cast, contract reads use human-readable function signatures instead of raw selectors:
# ERC-20 balance (auto-decoded to uint256)
sh scripts/rpc.sh call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 \
"balanceOf(address)(uint256)" 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
# Token name
sh scripts/rpc.sh call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 "name()(string)"
# Token decimals
sh scripts/rpc.sh call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 "decimals()(uint8)"
# Token symbol
sh scripts/rpc.sh call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 "symbol()(string)"
See references/erc20-methods.md for the full selector reference and references/common-contracts.md for well-known addresses.
The IdentityRegistry and ReputationRegistry are standard contracts queryable with cast call. Write operations (registration, feedback) require a signing wallet (coming soon).
# Read agent registration URI
sh scripts/rpc.sh call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 \
"tokenURI(uint256)(string)" 42
# Check agent owner
sh scripts/rpc.sh call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 \
"ownerOf(uint256)(address)" 42
# Get agent's associated wallet
sh scripts/rpc.sh call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 \
"getAgentWallet(uint256)(address)" 42
# Read metadata
sh scripts/rpc.sh call 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 \
"getMetadata(uint256,string)(bytes)" 42 "x402.supported"
# Query reputation summary
sh scripts/rpc.sh call 0x8004BAa17C55a88189AE136b182e5fdA19dE9b63 \
"getSummary(uint256,address[],string,string)(uint64,int128,uint8)" 42 "[]" "quality" "30days"
# Query registration events
sh scripts/rpc.sh logs 0x8004A169FB4a3325136EB29fA0ceB6D2e539a432 \
$(cast sig-event "Registered(uint256,string,address)") --from-block 0
The rpc.py script is still available as a fallback if cast is not present:
python3 scripts/rpc.py eth_blockNumber
python3 scripts/rpc.py eth_getBalance 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
python3 scripts/rpc.py --network hoodi eth_chainId
eth_getLogs and receipt/block responses can be huge. Use these flags to
reduce the JSON before it lands in your context. ALL are opt-in; without
them the script behaves as before.
# How many Transfer events on USDC in this range? (No log array returned.)
python3 scripts/rpc.py --count --where 'topics[0]=0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' \
eth_getLogs 0x1500000 0x1500200 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# Last 10 Transfer events, only block + topics fields:
python3 scripts/rpc.py --tail 10 --fields blockNumber,topics \
--where 'topics[0]=0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef' \
eth_getLogs 0x1500000 0x1500200 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# Trim a receipt to the fields you actually want:
python3 scripts/rpc.py --fields transactionHash,status,gasUsed,blockNumber \
eth_getTransactionReceipt 0xabc...
Filters: --fields a,b,c (key projection), --where k=v,k=v (equality
AND filter, supports topics[N]), --limit N / --tail N, --count
(replace array with a count summary).
http://erpc.erpc.svc.cluster.local/rpc/, never call external RPC providerssh, not bash — do not use bashisms like ${var//pattern}, ${var:offset}, [[ ]], or arrays. Use POSIX-compatible syntax onlycast preferred — use rpc.sh (Foundry cast) for all queries. Fall back to rpc.py (Python stdlib) only if cast is unavailableeth_getTransactionByHash return null for unknown hashesdata-ai
Spawn durable child Hermes agents from inside Obol Stack. Creates child namespaces, optional profile/env Secrets, Agent CRDs, and optional ServiceOffers for x402-paid child services.
data-ai
Buy from any x402-gated endpoint. Two flows: `pay` for one-shot HTTP services (single authorization, no sidecar), and `buy` for long-running paid inference (pre-authorized batch via PurchaseRequest, exposed as `paid/<remote-model>`). Supports USDC (EIP-3009) and OBOL (Permit2). Zero signer access at runtime — spending is capped by design and nothing moves on-chain until a voucher is spent.
testing
Sell access to services via x402 payment gating. Create ServiceOffer CRDs that automatically health-check upstreams, create payment-gated routes, and optionally pull models and register on ERC-8004. Supports inference, HTTP, and fine-tuning service types.
testing
End-to-end guide for monetizing GPU resources or HTTP services through obol-stack. Covers pre-flight checks, model detection, pricing research, selling via x402, ERC-8004 registration, and verification. Use this skill when the user wants to monetize their machine.