Skip to main content Skills Marketplace Discover and explore AI skills built by the community.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Copy promptShow prompt details A direct command skips the review prompt. Inspect the source before running it.
npx skills add https://github.com/johnalbertini14-glitch/openclaw-skills --skill ethereum-read-onlyThe command stays on one line. Scroll horizontally to inspect it before copying.
Prefer a local copy? Download the files currently available to SkillsMP.
Download Zip Downloading... More from this repository Related occupations SOC
Based on SOC occupation classification
name ethereum-read-only version 1.0.0 description Foundry castを使用したウォレット不要のオンチェーン状態読み取り
Ethereum読み取り専用アクセス
Foundryのcastコマンドを使用してウォレットなしでEthereumブロックチェーンの状態を読み取る方法。ブロック情報、コントラクト状態、イベントログ、ENS解決の実装ガイドです。
セットアップ
Foundryインストール
curl -L https://foundry.paradigm.xyz | bash
foundryup
cast --version
RPC設定
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"
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
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"
ブロック範囲分析
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
check_erc20_balance () {
local token_address="$1 "
local wallet_address="$2 "
echo "=== ERC20残高確認 ==="
echo "トークン: $token_address "
echo "ウォレット: $wallet_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
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 "
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
ENS操作
ENS解決システム
#!/bin/bash
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 "
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
ABI デコーディング
トランザクション・ログ解析
#!/bin/bash
decode_function_call () {
local tx_hash="$1 "
local abi_file="$2 "
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} ..."
local selector="${input_data:2:8} "
echo "関数セレクタ: 0x$selector "
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
実用的なスクリプト例
DeFi ポートフォリオチェッカー
#!/bin/bash
check_defi_portfolio () {
local wallet="$1 "
echo "=== DeFi ポートフォリオ: $wallet ==="
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/ での取引で入手可能です。
"総ガス使用量: $total_gas "
echo
"平均TX/ブロック: $((total_tx / (end_block - start_block + 1) ))"
"decimals()(uint8)"
echo
"トークン名: $name "
echo
"シンボル: $symbol "
echo
"小数点桁数: $decimals "
local
"$(cast to-dec "$balance " ) "
local
"$(echo "scale=6; $human_balance / 10^$decimals " | bc -l) "
echo
"表示用残高: $scaled_balance $symbol "
check_uniswap_pool
local
"$1 "
echo
"=== Uniswap V3 プール情報 ==="
echo
"プールアドレス: $pool_address "
local
"$(cast call "$pool_address " "token0()(address)" --rpc-url $ETH_RPC_URL) "
local
"$(cast call "$pool_address " "token1()(address)" --rpc-url $ETH_RPC_URL) "
local
"$(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
"$(cast call "$pool_address " "liquidity()(uint128)" --rpc-url $ETH_RPC_URL) "
echo
"流動性: $(cast to-dec "$liquidity " ) "
local
"$(cast call "$pool_address " "slot0()(uint160,int24,uint16,uint16,uint16,uint8,bool)" --rpc-url $ETH_RPC_URL) "
echo
"Slot0: $slot0 "
resolve_ens
local
"$1 "
echo
"=== ENS解決 ==="
echo
"アドレス: $address "
local
"$(cast lookup-address "$address " --rpc-url $ETH_RPC_URL 2>/dev/null || echo "なし" ) "
echo
"ENS名: $ens_name "
"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64"
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
"0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8"
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
then
"$cmd $sender "
fi
if
"$receiver "
then
if
"$sender "
then
"$cmd '' $receiver "
else
"$cmd $receiver "
fi
fi
echo
"実行コマンド: $cmd "
eval
"$cmd "
'.[] | "ブロック: \(.blockNumber), TX: \(.transactionHash), ログインデックス: \(.logIndex)"'
search_custom_events
local
"$1 "
local
"$2 "
local
"$3 "
local
"$4 "
echo
"=== カスタムイベント検索 ==="
echo
"シグネチャ: $event_signature "
"$contract_address "
"$from_block "
"$to_block "
"$event_signature "
$ETH_RPC_URL
'.'
analyze_dex_trades
local
"$1 "
local
"$2 "
local
"$3 "
echo
"=== DEX取引分析 ==="
local
"0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67"
"$pool_address "
"$from_block "
"$to_block "
"$swap_sig "
$ETH_RPC_URL
'.[] | "取引: ブロック \(.blockNumber), TX \(.transactionHash), ガス使用: \(.gasUsed)"'
"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64"
"19000000"
"19000100"
"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984"
"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925"
"19000000"
"19000050"
"text(bytes32,string)(string)"
"$(cast namehash "$ens_name " ) "
"$key "
""
if
"$value "
"$value "
'""'
then
echo
" $key : $value "
fi
done
resolve_address_to_ens
local
"$1 "
echo
"=== アドレス → ENS解決 ==="
echo
"アドレス: $address "
local
"$(cast lookup-address "$address " --rpc-url $ETH_RPC_URL 2>/dev/null || echo "なし" ) "
echo
"ENS名: $ens_name "
if
"$ens_name "
"なし"
then
local
"$(cast resolve-name "$ens_name " --rpc-url $ETH_RPC_URL) "
if
"$reverse_address "
"$address "
then
echo
"プライマリ名: はい"
else
echo
"プライマリ名: いいえ($reverse_address )"
fi
fi
ens_domain_info
local
"$1 "
echo
"=== ENSドメイン詳細情報 ==="
local
"$(cast call 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e \
"owner(bytes32)(address)" \
"$(cast namehash "$ens_name " ) " \
--rpc-url $ETH_RPC_URL) "
echo
"所有者: $owner "
if
"$ens_name "
then
local
"0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85"
local
"$(cast keccak "$(echo -n "${ens_name%.eth} " ) " ) "
local
"$(cast call "$registrar " \
"ownerOf(uint256)(address)" \
"$token_id " \
--rpc-url $ETH_RPC_URL 2>/dev/null || echo "なし" ) "
echo
"登録者: $registrant "
local
"$(cast call "$registrar " \
"nameExpires(uint256)(uint256)" \
"$token_id " \
--rpc-url $ETH_RPC_URL 2>/dev/null || echo "0" ) "
if
"$expires "
"0"
then
echo
"有効期限: $(date -d @$((expires) ) +'%Y-%m-%d %H:%M:%S')"
fi
fi
"vitalik.eth"
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
"uniswap.eth"
echo
"関数署名: $function_sig "
if
"$abi_file "
then
"$input_data "
"$abi_file "
fi
decode_event_log
local
"$1 "
local
"$2 "
local
"$3 "
echo
"=== イベントログデコード ==="
local
"$(cast receipt "$tx_hash " --rpc-url $ETH_RPC_URL | jq ".logs[$log_index ]" ) "
local
"$(echo "$logs " | jq -r '.topics[]') "
local
"$(echo "$logs " | jq -r '.data') "
echo
"トピック: $topics "
echo
"データ: $data "
local
"$(echo "$topics " | head -1 | cut -c3-) "
local
"$(curl -s "https://www.4byte.directory/api/v1/event-signatures/?hex_signature=0x$event_sig " | jq -r '.results[0].text_signature') "
echo
"イベント署名: $event_name "
if
"$abi_file "
then
echo
"詳細デコードにはABIファイルと追加ツールが必要です"
fi
common_selectors
echo
"=== よく使われる関数セレクタ ==="
cat
'EOF'
$balance
$decimals
echo
"$symbol : $human_balance "
done
"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"