Foundry castを使用したウォレット不要のオンチェーン状態読み取り
数据来源:ClawHub。 在 ClawSkills 查看
选择你使用的 Agent
方法一:命令行安装(推荐)
推荐(无需提前安装 clawhub)
npx clawhub@latest --dir ~/.claude/skills install ethereum-read-only或使用 clawhub CLI(需提前安装)
clawhub --dir ~/.claude/skills install ethereum-read-only⚠️ 需要 Node.js 18+,没有 Node?请使用下方方法二直接下载 ZIP。 安装 Node.js →
方法二:手动下载安装(无需 Node)
下载 ZIP,解压后将文件夹放到以下路径,重启 Agent 即可:
安装路径
~/.claude/skills/ethereum-read-only/💡解压后将文件夹放到上方路径,重启 Agent 即可生效
--- name: ethereum-read-only version: 1.0.0 description: Foundry castを使用したウォレット不要のオンチェーン状態読み取り ---
Foundryのcastコマンドを使用してウォレットなしでEthereumブロックチェーンの状態を読み取る方法。ブロック情報、コントラクト状態、イベントログ、ENS解決の実装ガイドです。
# Foundryインストール
curl -L https://foundry.paradigm.xyz | bash
foundryup
# 動作確認
cast --version
# 環境変数設定(~/.bashrc または ~/.zshrc)
export ETH_RPC_URL="https://eth-mainnet.alchemyapi.io/v2/YOUR-API-KEY"
export POLYGON_RPC_URL="https://polygon-mainnet.g.alchemy.com/v2/YOUR-API-KEY"
export ARB_RPC_URL="https://arb-mainnet.g.alchemy.com/v2/YOUR-API-KEY"
# 無料RPCの使用(レート制限あり)
export ETH_RPC_URL="https://rpc.ankr.com/eth"
export POLYGON_RPC_URL="https://rpc.ankr.com/polygon"
# 設定確認
cast client --rpc-url $ETH_RPC_URL
#!/bin/bash
# block-inspector.sh
# 最新ブロック番号取得
get_latest_block() {
echo "最新ブロック番号:"
cast block-number --rpc-url $ETH_RPC_URL
}
# ブロック基本情報
inspect_block() {
local block_number="$1"
echo "=== ブロック $block_number 基本情報 ==="
cast block "$block_number" --rpc-url $ETH_RPC_URL
}
# トランザクション込みの詳細ブロック情報
inspect_block_full() {
local block_number="$1"
echo "=== ブロック $block_number 詳細情報(トランザクション含む)==="
cast block "$block_number" --full --rpc-url $ETH_RPC_URL
}
# ブロック統計
block_stats() {
local block_number="$1"
echo "=== ブロック $block_number 統計 ==="
# トランザクション数
local tx_count="$(cast block "$block_number" --rpc-url $ETH_RPC_URL | jq -r '.transactions | length')"
echo "トランザクション数: $tx_count"
# ガス使用量
local gas_used="$(cast block "$block_number" --rpc-url $ETH_RPC_URL | jq -r '.gasUsed')"
echo "ガス使用量: $gas_used"
# タイムスタンプ
local timestamp="$(cast block "$block_number" --rpc-url $ETH_RPC_URL | jq -r '.timestamp')"
echo "ブロック時刻: $(date -d @$((timestamp)) +'%Y-%m-%d %H:%M:%S')"
}
# 使用例
get_latest_block
inspect_block "latest"
block_stats "latest"
# block-range-analyzer.sh
analyze_block_range() {
local start_block="$1"
local end_block="$2"
echo "=== ブロック範囲分析: $start_block - $end_block ==="
local total_tx=0
local total_gas=0
for ((block=$start_block; block<=$end_block; block++)); do
echo "ブロック $block を処理中..."
local block_data="$(cast block "$block" --rpc-url $ETH_RPC_URL)"
local tx_count="$(echo "$block_data" | jq -r '.transactions | length')"
local gas_used="$(echo "$block_data" | jq -r '.gasUsed')"
total_tx=$((total_tx + tx_count))
total_gas=$((total_gas + gas_used))
echo " TX: $tx_count, Gas: $gas_used"
done
echo ""
echo "=== サマリー ==="
echo "総トランザクション数: $total_tx"
echo "総ガス使用量: $total_gas"
echo "平均TX/ブロック: $((total_tx / (end_block - start_block + 1)))"
}
# 使用例
analyze_block_range 19000000 19000010
#!/bin/bash
# contract-reader.sh
# ERC20トークン残高確認
check_erc20_balance() {
local token_address="$1"
local wallet_address="$2"
echo "=== ERC20残高確認 ==="
echo "トークン: $token_address"
echo "ウォレット: $wallet_address"
# balanceOf(address) 関数呼び出し
local balance="$(cast call "$token_address" \
"balanceOf(address)(uint256)" \
"$wallet_address" \
--rpc-url $ETH_RPC_URL)"
echo "残高: $balance"
# トークン名取得
local name="$(cast call "$token_address" \
"name()(string)" \
--rpc-url $ETH_RPC_URL)"
# トークンシンボル取得
local symbol="$(cast call "$token_address" \
"symbol()(string)" \
--rpc-url $ETH_RPC_URL)"
# 小数点桁数取得
local decimals="$(cast call "$token_address" \
"decimals()(uint8)" \
--rpc-url $ETH_RPC_URL)"
echo "トークン名: $name"
echo "シンボル: $symbol"
echo "小数点桁数: $decimals"
# 人間が読める形式に変換
local human_balance="$(cast to-dec "$balance")"
local scaled_balance="$(echo "scale=6; $human_balance / 10^$decimals" | bc -l)"
echo "表示用残高: $scaled_balance $symbol"
}
# Uniswap V3プール情報取得
check_uniswap_pool() {
local pool_address="$1"
echo "=== Uniswap V3 プール情報 ==="
echo "プールアドレス: $pool_address"
# プール基本情報
local token0="$(cast call "$pool_address" "token0()(address)" --rpc-url $ETH_RPC_URL)"
local token1="$(cast call "$pool_address" "token1()(address)" --rpc-url $ETH_RPC_URL)"
local fee="$(cast call "$pool_address" "fee()(uint24)" --rpc-url $ETH_RPC_URL)"
echo "Token0: $token0"
echo "Token1: $token1"
echo "手数料: $(cast to-dec "$fee") (0.01% = 100)"
# 現在の流動性とプライス
local liquidity="$(cast call "$pool_address" "liquidity()(uint128)" --rpc-url $ETH_RPC_URL)"
echo "流動性: $(cast to-dec "$liquidity")"
# slot0情報(価格、ティック等)
local slot0="$(cast call "$pool_address" "slot0()(uint160,int24,uint16,uint16,uint16,uint8,bool)" --rpc-url $ETH_RPC_URL)"
echo "Slot0: $slot0"
}
# ENSリバースルックアップ
resolve_ens() {
local address="$1"
echo "=== ENS解決 ==="
echo "アドレス: $address"
# ENS名前解決
local ens_name="$(cast lookup-address "$address" --rpc-url $ETH_RPC_URL 2>/dev/null || echo "なし")"
echo "ENS名: $ens_name"
}
# 使用例
check_erc20_balance "0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64" "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" # USDC, Vitalik
check_uniswap_pool "0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8" # USDC/ETH 0.3%
resolve_ens "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
#!/bin/bash
# event-log-searcher.sh
# Transfer イベント検索
search_transfer_events() {
local contract_address="$1"
local from_block="$2"
local to_block="$3"
local sender="${4:-}"
local receiver="${5:-}"
echo "=== Transfer イベント検索 ==="
echo "コントラクト: $contract_address"
echo "ブロック範囲: $from_block - $to_block"
# Transfer(address,address,uint256) イベントシグネチャ
local transfer_sig="0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
# 基本検索コマンド構築
local cmd="cast logs --rpc-url $ETH_RPC_URL"
cmd="$cmd --address $contract_address"
cmd="$cmd --from-block $from_block"
cmd="$cmd --to-block $to_block"
cmd="$cmd $transfer_sig"
# フィルター追加
if [[ -n "$sender" ]]; then
cmd="$cmd $sender"
fi
if [[ -n "$receiver" ]]; then
if [[ -z "$sender" ]]; then
cmd="$cmd '' $receiver" # sender未指定の場合は空文字
else
cmd="$cmd $receiver"
fi
fi
echo "実行コマンド: $cmd"
# ログ実行と結果パース
eval "$cmd" | jq -r '.[] | "ブロック: \(.blockNumber), TX: \(.transactionHash), ログインデックス: \(.logIndex)"'
}
# 汎用イベント検索
search_custom_events() {
local contract_address="$1"
local event_signature="$2"
local from_block="$3"
local to_block="$4"
echo "=== カスタムイベント検索 ==="
echo "シグネチャ: $event_signature"
cast logs \
--address "$contract_address" \
--from-block "$from_block" \
--to-block "$to_block" \
"$event_signature" \
--rpc-url $ETH_RPC_URL \
| jq '.'
}
# DEX取引分析
analyze_dex_trades() {
local pool_address="$1"
local from_block="$2"
local to_block="$3"
echo "=== DEX取引分析 ==="
# Swap イベント (Uniswap V3: Swap(address,address,int256,int256,uint160,uint128,int24))
local swap_sig="0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67"
cast logs \
--address "$pool_address" \
--from-block "$from_block" \
--to-block "$to_block" \
"$swap_sig" \
--rpc-url $ETH_RPC_URL \
| jq -r '.[] | "取引: ブロック \(.blockNumber), TX \(.transactionHash), ガス使用: \(.gasUsed)"'
}
...安装 Ethereum Read Only 后,可以对 AI 说这些话来触发它
Help me get started with Ethereum Read Only
Explains what Ethereum Read Only does, walks through the setup, and runs a quick demo based on your current project
Use Ethereum Read Only to walletless on-chain state reading using Foundry cast
Invokes Ethereum Read Only with the right parameters and returns the result directly in the conversation
What can I do with Ethereum Read Only in my finance & investment workflow?
Lists the top use cases for Ethereum Read Only, with example commands for each scenario
将技能文件夹放到 ~/.claude/skills/ethereum-read-only/ 目录(个人级,所有项目可用),或 .claude/skills/ethereum-read-only/(项目级)。重启 AI 客户端后,用 /ethereum-read-only 主动调用,或让 AI 根据上下文自动发现并使用。
Ethereum Read Only 支持 Claude、Cursor、OpenClaw,可与这些 AI 平台无缝集成,扩展其能力。
Ethereum Read Only 可免费安装使用。请查阅仓库了解许可证信息。
Foundry castを使用したウォレット不要のオンチェーン状態読み取り
Ethereum Read Only 属于「Finance & Investment」分类,该分类的技能帮助 AI 智能体在此领域执行专业任务。
Automate my finance & investment tasks using Ethereum Read Only
Identifies repetitive steps in your workflow and sets up Ethereum Read Only to handle them automatically