基于 SOC 职业分类
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/johnalbertini14-glitch/openclaw-skills --skill ethereum-read-only命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
Use this skill to create a Polymarket wallet for your agent and trade on prediction markets. Browse markets, place bets, manage positions — all without exposing private keys.
ClawSec suite manager with embedded advisory-feed monitoring, cryptographic signature verification, approval-gated malicious-skill response, and guided setup for additional security skills.
Automated daily security audits for OpenClaw agents with email reporting. Runs deep audits and sends formatted reports.
| 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
}
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" \
\
--rpc-url $ETH_RPC_URL)"
human_balance=
scaled_balance=
}
() {
pool_address=
token0=
token1=
fee=
liquidity=
slot0=
}
() {
address=
ens_name=
}
check_erc20_balance
check_uniswap_pool
resolve_ens
#!/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" ]];
cmd=
[[ -n ]];
[[ -z ]];
cmd=
cmd=
| jq -r
}
() {
contract_address=
event_signature=
from_block=
to_block=
cast logs \
--address \
--from-block \
--to-block \
\
--rpc-url \
| jq
}
() {
pool_address=
from_block=
to_block=
swap_sig=
cast logs \
--address \
--from-block \
--to-block \
\
--rpc-url \
| jq -r
}
search_transfer_events
search_custom_events
#!/bin/bash
# ens-resolver.sh
# ENS名からアドレス解決
resolve_ens_to_address() {
local ens_name="$1"
echo "=== ENS → アドレス解決 ==="
echo "ENS名: $ens_name"
# 基本的なアドレス解決
local address="$(cast resolve-name "$ens_name" --rpc-url $ETH_RPC_URL)"
echo "アドレス: $address"
# コンテンツハッシュ取得(IPFS等)
local content_hash="$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \
"contenthash(bytes32)(bytes)" \
"$(cast namehash "$ens_name")" \
--rpc-url $ETH_RPC_URL 2>/dev/null || echo "なし")"
echo "コンテンツハッシュ: $content_hash"
# テキストレコード取得
echo "テキストレコード:"
for key in "email" "url" "avatar" "description" "notice" "keywords" "com.github" "com.twitter"; do
local value="$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \
\
\
\
--rpc-url $ETH_RPC_URL 2>/dev/null || echo )"
[[ -n && != ]];
}
() {
address=
ens_name=
[[ != ]];
reverse_address=
[[ == ]];
}
() {
ens_name=
owner=
[[ == *.eth ]];
registrar=
token_id=
registrant=
expires=
[[ != ]];
}
resolve_ens_to_address
resolve_address_to_ens
ens_domain_info
#!/bin/bash
# abi-decoder.sh
# 関数呼び出しデコード
decode_function_call() {
local tx_hash="$1"
local abi_file="$2" # JSONファイルまたはEtherscan署名
echo "=== 関数呼び出しデコード ==="
echo "TX: $tx_hash"
# トランザクション詳細取得
local tx_data="$(cast tx "$tx_hash" --rpc-url $ETH_RPC_URL)"
local input_data="$(echo "$tx_data" | jq -r '.input')"
local to_address="$(echo "$tx_data" | jq -r '.to')"
echo "送信先: $to_address"
echo "入力データ: ${input_data:0:50}..."
# 4byteセレクタ抽出
local selector="${input_data:2:8}"
echo "関数セレクタ: 0x$selector"
# 4byte.directory から関数名取得
local function_sig="$(curl -s "https://www.4byte.directory/api/v1/signatures/?hex_signature=0x$selector" | jq -r '.results[0].text_signature')"
[[ -f ]];
cast 4byte-decode --abi-path
}
() {
tx_hash=
log_index=
abi_file=
logs=
topics=
data=
event_sig=
event_name=
[[ -f ]];
}
() {
<<
0xa9059cbb: transfer(address,uint256)
0x095ea7b3: approve(address,uint256)
0x23b872dd: transferFrom(address,address,uint256)
0x70a08231: balanceOf(address)
0x18160ddd: totalSupply()
0xdd62ed3e: allowance(address,address)
0x40c10f19: mint(address,uint256)
0x42966c68: burn(uint256)
0x7ff36ab5: swapExactETHForTokens(uint256,address[],address,uint256)
0x38ed1739: swapExactTokensForTokens(uint256,uint256,address[],address,uint256)
EOF
}
common_selectors
#!/bin/bash
# defi-portfolio-checker.sh
check_defi_portfolio() {
local wallet="$1"
echo "=== DeFi ポートフォリオ: $wallet ==="
# ETH残高
local eth_balance="$(cast balance "$wallet" --rpc-url $ETH_RPC_URL)"
echo "ETH: $(cast to-ether "$eth_balance") ETH"
# 主要トークン残高
local tokens=(
"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64:USDC:6"
"0xdAC17F958D2ee523a2206206994597C13D831ec7:USDT:6"
"0x6B175474E89094C44Da98b954EedeAC495271d0F:DAI:18"
"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984:UNI:18"
)
for token in "${tokens[@]}"; do
IFS=':' read -r address symbol decimals <<< "$token"
local balance="$(cast call "$address" "balanceOf(address)(uint256)" "$wallet" --rpc-url $ETH_RPC_URL)"
local human_balance="$(echo "scale=4; $(cast to-dec "") / 10^" | bc -l)"
}
check_defi_portfolio
ウォレット管理やトランザクション送信を含む完全なcast CLIガイドは kairyuu.net/exchange/ での取引で入手可能です。