{
  "schemaVersion": "1.0",
  "item": {
    "slug": "ethereum-read-only",
    "name": "Ethereum Read Only",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Byron-McKeeby/ethereum-read-only",
    "canonicalUrl": "https://clawhub.ai/Byron-McKeeby/ethereum-read-only",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/ethereum-read-only",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=ethereum-read-only",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/ethereum-read-only"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/ethereum-read-only",
    "agentPageUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Ethereum読み取り専用アクセス",
        "body": "Foundryのcastコマンドを使用してウォレットなしでEthereumブロックチェーンの状態を読み取る方法。ブロック情報、コントラクト状態、イベントログ、ENS解決の実装ガイドです。"
      },
      {
        "title": "Foundryインストール",
        "body": "# Foundryインストール\ncurl -L https://foundry.paradigm.xyz | bash\nfoundryup\n\n# 動作確認\ncast --version"
      },
      {
        "title": "RPC設定",
        "body": "# 環境変数設定（~/.bashrc または ~/.zshrc）\nexport ETH_RPC_URL=\"https://eth-mainnet.alchemyapi.io/v2/YOUR-API-KEY\"\nexport POLYGON_RPC_URL=\"https://polygon-mainnet.g.alchemy.com/v2/YOUR-API-KEY\"\nexport ARB_RPC_URL=\"https://arb-mainnet.g.alchemy.com/v2/YOUR-API-KEY\"\n\n# 無料RPCの使用（レート制限あり）\nexport ETH_RPC_URL=\"https://rpc.ankr.com/eth\"\nexport POLYGON_RPC_URL=\"https://rpc.ankr.com/polygon\"\n\n# 設定確認\ncast client --rpc-url $ETH_RPC_URL"
      },
      {
        "title": "基本的なブロック検査",
        "body": "#!/bin/bash\n# block-inspector.sh\n\n# 最新ブロック番号取得\nget_latest_block() {\n    echo \"最新ブロック番号:\"\n    cast block-number --rpc-url $ETH_RPC_URL\n}\n\n# ブロック基本情報\ninspect_block() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 基本情報 ===\"\n    cast block \"$block_number\" --rpc-url $ETH_RPC_URL\n}\n\n# トランザクション込みの詳細ブロック情報\ninspect_block_full() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 詳細情報（トランザクション含む）===\"\n    cast block \"$block_number\" --full --rpc-url $ETH_RPC_URL\n}\n\n# ブロック統計\nblock_stats() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 統計 ===\"\n    \n    # トランザクション数\n    local tx_count=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.transactions | length')\"\n    echo \"トランザクション数: $tx_count\"\n    \n    # ガス使用量\n    local gas_used=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.gasUsed')\"\n    echo \"ガス使用量: $gas_used\"\n    \n    # タイムスタンプ\n    local timestamp=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.timestamp')\"\n    echo \"ブロック時刻: $(date -d @$((timestamp)) +'%Y-%m-%d %H:%M:%S')\"\n}\n\n# 使用例\nget_latest_block\ninspect_block \"latest\"\nblock_stats \"latest\""
      },
      {
        "title": "ブロック範囲分析",
        "body": "# block-range-analyzer.sh\n\nanalyze_block_range() {\n    local start_block=\"$1\"\n    local end_block=\"$2\"\n    \n    echo \"=== ブロック範囲分析: $start_block - $end_block ===\"\n    \n    local total_tx=0\n    local total_gas=0\n    \n    for ((block=$start_block; block<=$end_block; block++)); do\n        echo \"ブロック $block を処理中...\"\n        \n        local block_data=\"$(cast block \"$block\" --rpc-url $ETH_RPC_URL)\"\n        local tx_count=\"$(echo \"$block_data\" | jq -r '.transactions | length')\"\n        local gas_used=\"$(echo \"$block_data\" | jq -r '.gasUsed')\"\n        \n        total_tx=$((total_tx + tx_count))\n        total_gas=$((total_gas + gas_used))\n        \n        echo \"  TX: $tx_count, Gas: $gas_used\"\n    done\n    \n    echo \"\"\n    echo \"=== サマリー ===\"\n    echo \"総トランザクション数: $total_tx\"\n    echo \"総ガス使用量: $total_gas\"\n    echo \"平均TX/ブロック: $((total_tx / (end_block - start_block + 1)))\"\n}\n\n# 使用例\nanalyze_block_range 19000000 19000010"
      },
      {
        "title": "基本的なコントラクト呼び出し",
        "body": "#!/bin/bash\n# contract-reader.sh\n\n# ERC20トークン残高確認\ncheck_erc20_balance() {\n    local token_address=\"$1\"\n    local wallet_address=\"$2\"\n    \n    echo \"=== ERC20残高確認 ===\"\n    echo \"トークン: $token_address\"\n    echo \"ウォレット: $wallet_address\"\n    \n    # balanceOf(address) 関数呼び出し\n    local balance=\"$(cast call \"$token_address\" \\\n        \"balanceOf(address)(uint256)\" \\\n        \"$wallet_address\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"残高: $balance\"\n    \n    # トークン名取得\n    local name=\"$(cast call \"$token_address\" \\\n        \"name()(string)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    # トークンシンボル取得\n    local symbol=\"$(cast call \"$token_address\" \\\n        \"symbol()(string)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    # 小数点桁数取得\n    local decimals=\"$(cast call \"$token_address\" \\\n        \"decimals()(uint8)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"トークン名: $name\"\n    echo \"シンボル: $symbol\"\n    echo \"小数点桁数: $decimals\"\n    \n    # 人間が読める形式に変換\n    local human_balance=\"$(cast to-dec \"$balance\")\"\n    local scaled_balance=\"$(echo \"scale=6; $human_balance / 10^$decimals\" | bc -l)\"\n    echo \"表示用残高: $scaled_balance $symbol\"\n}\n\n# Uniswap V3プール情報取得\ncheck_uniswap_pool() {\n    local pool_address=\"$1\"\n    \n    echo \"=== Uniswap V3 プール情報 ===\"\n    echo \"プールアドレス: $pool_address\"\n    \n    # プール基本情報\n    local token0=\"$(cast call \"$pool_address\" \"token0()(address)\" --rpc-url $ETH_RPC_URL)\"\n    local token1=\"$(cast call \"$pool_address\" \"token1()(address)\" --rpc-url $ETH_RPC_URL)\"\n    local fee=\"$(cast call \"$pool_address\" \"fee()(uint24)\" --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"Token0: $token0\"\n    echo \"Token1: $token1\"\n    echo \"手数料: $(cast to-dec \"$fee\") (0.01% = 100)\"\n    \n    # 現在の流動性とプライス\n    local liquidity=\"$(cast call \"$pool_address\" \"liquidity()(uint128)\" --rpc-url $ETH_RPC_URL)\"\n    echo \"流動性: $(cast to-dec \"$liquidity\")\"\n    \n    # slot0情報（価格、ティック等）\n    local slot0=\"$(cast call \"$pool_address\" \"slot0()(uint160,int24,uint16,uint16,uint16,uint8,bool)\" --rpc-url $ETH_RPC_URL)\"\n    echo \"Slot0: $slot0\"\n}\n\n# ENSリバースルックアップ\nresolve_ens() {\n    local address=\"$1\"\n    \n    echo \"=== ENS解決 ===\"\n    echo \"アドレス: $address\"\n    \n    # ENS名前解決\n    local ens_name=\"$(cast lookup-address \"$address\" --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"ENS名: $ens_name\"\n}\n\n# 使用例\ncheck_erc20_balance \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64\" \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"  # USDC, Vitalik\ncheck_uniswap_pool \"0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8\"  # USDC/ETH 0.3%\nresolve_ens \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\""
      },
      {
        "title": "ログ検索システム",
        "body": "#!/bin/bash\n# event-log-searcher.sh\n\n# Transfer イベント検索\nsearch_transfer_events() {\n    local contract_address=\"$1\"\n    local from_block=\"$2\"\n    local to_block=\"$3\"\n    local sender=\"${4:-}\"\n    local receiver=\"${5:-}\"\n    \n    echo \"=== Transfer イベント検索 ===\"\n    echo \"コントラクト: $contract_address\"\n    echo \"ブロック範囲: $from_block - $to_block\"\n    \n    # Transfer(address,address,uint256) イベントシグネチャ\n    local transfer_sig=\"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n    \n    # 基本検索コマンド構築\n    local cmd=\"cast logs --rpc-url $ETH_RPC_URL\"\n    cmd=\"$cmd --address $contract_address\"\n    cmd=\"$cmd --from-block $from_block\"\n    cmd=\"$cmd --to-block $to_block\"\n    cmd=\"$cmd $transfer_sig\"\n    \n    # フィルター追加\n    if [[ -n \"$sender\" ]]; then\n        cmd=\"$cmd $sender\"\n    fi\n    \n    if [[ -n \"$receiver\" ]]; then\n        if [[ -z \"$sender\" ]]; then\n            cmd=\"$cmd '' $receiver\"  # sender未指定の場合は空文字\n        else\n            cmd=\"$cmd $receiver\"\n        fi\n    fi\n    \n    echo \"実行コマンド: $cmd\"\n    \n    # ログ実行と結果パース\n    eval \"$cmd\" | jq -r '.[] | \"ブロック: \\(.blockNumber), TX: \\(.transactionHash), ログインデックス: \\(.logIndex)\"'\n}\n\n# 汎用イベント検索\nsearch_custom_events() {\n    local contract_address=\"$1\"\n    local event_signature=\"$2\"\n    local from_block=\"$3\"\n    local to_block=\"$4\"\n    \n    echo \"=== カスタムイベント検索 ===\"\n    echo \"シグネチャ: $event_signature\"\n    \n    cast logs \\\n        --address \"$contract_address\" \\\n        --from-block \"$from_block\" \\\n        --to-block \"$to_block\" \\\n        \"$event_signature\" \\\n        --rpc-url $ETH_RPC_URL \\\n        | jq '.'\n}\n\n# DEX取引分析\nanalyze_dex_trades() {\n    local pool_address=\"$1\"\n    local from_block=\"$2\"\n    local to_block=\"$3\"\n    \n    echo \"=== DEX取引分析 ===\"\n    \n    # Swap イベント (Uniswap V3: Swap(address,address,int256,int256,uint160,uint128,int24))\n    local swap_sig=\"0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67\"\n    \n    cast logs \\\n        --address \"$pool_address\" \\\n        --from-block \"$from_block\" \\\n        --to-block \"$to_block\" \\\n        \"$swap_sig\" \\\n        --rpc-url $ETH_RPC_URL \\\n        | jq -r '.[] | \"取引: ブロック \\(.blockNumber), TX \\(.transactionHash), ガス使用: \\(.gasUsed)\"'\n}\n\n# 使用例\nsearch_transfer_events \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64\" \"19000000\" \"19000100\"  # USDC transfers\nsearch_custom_events \"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984\" \"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\" \"19000000\" \"19000050\"  # UNI Approval"
      },
      {
        "title": "ENS解決システム",
        "body": "#!/bin/bash\n# ens-resolver.sh\n\n# ENS名からアドレス解決\nresolve_ens_to_address() {\n    local ens_name=\"$1\"\n    \n    echo \"=== ENS → アドレス解決 ===\"\n    echo \"ENS名: $ens_name\"\n    \n    # 基本的なアドレス解決\n    local address=\"$(cast resolve-name \"$ens_name\" --rpc-url $ETH_RPC_URL)\"\n    echo \"アドレス: $address\"\n    \n    # コンテンツハッシュ取得（IPFS等）\n    local content_hash=\"$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \\\n        \"contenthash(bytes32)(bytes)\" \\\n        \"$(cast namehash \"$ens_name\")\" \\\n        --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"コンテンツハッシュ: $content_hash\"\n    \n    # テキストレコード取得\n    echo \"テキストレコード:\"\n    for key in \"email\" \"url\" \"avatar\" \"description\" \"notice\" \"keywords\" \"com.github\" \"com.twitter\"; do\n        local value=\"$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \\\n            \"text(bytes32,string)(string)\" \\\n            \"$(cast namehash \"$ens_name\")\" \\\n            \"$key\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"\")\"\n        if [[ -n \"$value\" && \"$value\" != '\"\"' ]]; then\n            echo \"  $key: $value\"\n        fi\n    done\n}\n\n# アドレスからENS名解決\nresolve_address_to_ens() {\n    local address=\"$1\"\n    \n    echo \"=== アドレス → ENS解決 ===\"\n    echo \"アドレス: $address\"\n    \n    local ens_name=\"$(cast lookup-address \"$address\" --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"ENS名: $ens_name\"\n    \n    # プライマリ名確認\n    if [[ \"$ens_name\" != \"なし\" ]]; then\n        local reverse_address=\"$(cast resolve-name \"$ens_name\" --rpc-url $ETH_RPC_URL)\"\n        if [[ \"$reverse_address\" == \"$address\" ]]; then\n            echo \"プライマリ名: はい\"\n        else\n            echo \"プライマリ名: いいえ（$reverse_address）\"\n        fi\n    fi\n}\n\n# ENSドメイン情報詳細\nens_domain_info() {\n    local ens_name=\"$1\"\n    \n    echo \"=== ENSドメイン詳細情報 ===\"\n    \n    # 所有者情報\n    local owner=\"$(cast call 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e \\\n        \"owner(bytes32)(address)\" \\\n        \"$(cast namehash \"$ens_name\")\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    echo \"所有者: $owner\"\n    \n    # レジストラ情報（.ethドメインの場合）\n    if [[ \"$ens_name\" == *.eth ]]; then\n        local registrar=\"0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85\"\n        local token_id=\"$(cast keccak \"$(echo -n \"${ens_name%.eth}\")\")\"\n        \n        local registrant=\"$(cast call \"$registrar\" \\\n            \"ownerOf(uint256)(address)\" \\\n            \"$token_id\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n        echo \"登録者: $registrant\"\n        \n        # 有効期限\n        local expires=\"$(cast call \"$registrar\" \\\n            \"nameExpires(uint256)(uint256)\" \\\n            \"$token_id\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"0\")\"\n        if [[ \"$expires\" != \"0\" ]]; then\n            echo \"有効期限: $(date -d @$((expires)) +'%Y-%m-%d %H:%M:%S')\"\n        fi\n    fi\n}\n\n# 使用例\nresolve_ens_to_address \"vitalik.eth\"\nresolve_address_to_ens \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\nens_domain_info \"uniswap.eth\""
      },
      {
        "title": "トランザクション・ログ解析",
        "body": "#!/bin/bash\n# abi-decoder.sh\n\n# 関数呼び出しデコード\ndecode_function_call() {\n    local tx_hash=\"$1\"\n    local abi_file=\"$2\"  # JSONファイルまたはEtherscan署名\n    \n    echo \"=== 関数呼び出しデコード ===\"\n    echo \"TX: $tx_hash\"\n    \n    # トランザクション詳細取得\n    local tx_data=\"$(cast tx \"$tx_hash\" --rpc-url $ETH_RPC_URL)\"\n    local input_data=\"$(echo \"$tx_data\" | jq -r '.input')\"\n    local to_address=\"$(echo \"$tx_data\" | jq -r '.to')\"\n    \n    echo \"送信先: $to_address\"\n    echo \"入力データ: ${input_data:0:50}...\"\n    \n    # 4byteセレクタ抽出\n    local selector=\"${input_data:2:8}\"\n    echo \"関数セレクタ: 0x$selector\"\n    \n    # 4byte.directory から関数名取得\n    local function_sig=\"$(curl -s \"https://www.4byte.directory/api/v1/signatures/?hex_signature=0x$selector\" | jq -r '.results[0].text_signature')\"\n    echo \"関数署名: $function_sig\"\n    \n    # デコード（ABIファイルがある場合）\n    if [[ -f \"$abi_file\" ]]; then\n        cast 4byte-decode \"$input_data\" --abi-path \"$abi_file\"\n    fi\n}\n\n# ログイベントデコード  \ndecode_event_log() {\n    local tx_hash=\"$1\"\n    local log_index=\"$2\"\n    local abi_file=\"$3\"\n    \n    echo \"=== イベントログデコード ===\"\n    \n    # ログ取得\n    local logs=\"$(cast receipt \"$tx_hash\" --rpc-url $ETH_RPC_URL | jq \".logs[$log_index]\")\"\n    local topics=\"$(echo \"$logs\" | jq -r '.topics[]')\"\n    local data=\"$(echo \"$logs\" | jq -r '.data')\"\n    \n    echo \"トピック: $topics\"\n    echo \"データ: $data\"\n    \n    # イベント署名解決\n    local event_sig=\"$(echo \"$topics\" | head -1 | cut -c3-)\"\n    local event_name=\"$(curl -s \"https://www.4byte.directory/api/v1/event-signatures/?hex_signature=0x$event_sig\" | jq -r '.results[0].text_signature')\"\n    echo \"イベント署名: $event_name\"\n    \n    # ABIデコード\n    if [[ -f \"$abi_file\" ]]; then\n        # Foundryでのログデコードは限定的なので、手動実装が必要\n        echo \"詳細デコードにはABIファイルと追加ツールが必要です\"\n    fi\n}\n\n# よく使われる関数セレクタ辞書\ncommon_selectors() {\n    echo \"=== よく使われる関数セレクタ ===\"\n    cat << 'EOF'\n0xa9059cbb: transfer(address,uint256)\n0x095ea7b3: approve(address,uint256)\n0x23b872dd: transferFrom(address,address,uint256)\n0x70a08231: balanceOf(address)\n0x18160ddd: totalSupply()\n0xdd62ed3e: allowance(address,address)\n0x40c10f19: mint(address,uint256)\n0x42966c68: burn(uint256)\n0x7ff36ab5: swapExactETHForTokens(uint256,address[],address,uint256)\n0x38ed1739: swapExactTokensForTokens(uint256,uint256,address[],address,uint256)\nEOF\n}\n\n# 使用例\ncommon_selectors\n# decode_function_call \"0x...\" \"./erc20.abi.json\""
      },
      {
        "title": "DeFi ポートフォリオチェッカー",
        "body": "#!/bin/bash\n# defi-portfolio-checker.sh\n\ncheck_defi_portfolio() {\n    local wallet=\"$1\"\n    \n    echo \"=== DeFi ポートフォリオ: $wallet ===\"\n    \n    # ETH残高\n    local eth_balance=\"$(cast balance \"$wallet\" --rpc-url $ETH_RPC_URL)\"\n    echo \"ETH: $(cast to-ether \"$eth_balance\") ETH\"\n    \n    # 主要トークン残高\n    local tokens=(\n        \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64:USDC:6\"\n        \"0xdAC17F958D2ee523a2206206994597C13D831ec7:USDT:6\" \n        \"0x6B175474E89094C44Da98b954EedeAC495271d0F:DAI:18\"\n        \"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984:UNI:18\"\n    )\n    \n    for token in \"${tokens[@]}\"; do\n        IFS=':' read -r address symbol decimals <<< \"$token\"\n        local balance=\"$(cast call \"$address\" \"balanceOf(address)(uint256)\" \"$wallet\" --rpc-url $ETH_RPC_URL)\"\n        local human_balance=\"$(echo \"scale=4; $(cast to-dec \"$balance\") / 10^$decimals\" | bc -l)\"\n        echo \"$symbol: $human_balance\"\n    done\n}\n\n# 使用例\ncheck_defi_portfolio \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\n\nウォレット管理やトランザクション送信を含む完全なcast CLIガイドは kairyuu.net/exchange/ での取引で入手可能です。"
      }
    ],
    "body": "Ethereum読み取り専用アクセス\n\nFoundryのcastコマンドを使用してウォレットなしでEthereumブロックチェーンの状態を読み取る方法。ブロック情報、コントラクト状態、イベントログ、ENS解決の実装ガイドです。\n\nセットアップ\nFoundryインストール\n# Foundryインストール\ncurl -L https://foundry.paradigm.xyz | bash\nfoundryup\n\n# 動作確認\ncast --version\n\nRPC設定\n# 環境変数設定（~/.bashrc または ~/.zshrc）\nexport ETH_RPC_URL=\"https://eth-mainnet.alchemyapi.io/v2/YOUR-API-KEY\"\nexport POLYGON_RPC_URL=\"https://polygon-mainnet.g.alchemy.com/v2/YOUR-API-KEY\"\nexport ARB_RPC_URL=\"https://arb-mainnet.g.alchemy.com/v2/YOUR-API-KEY\"\n\n# 無料RPCの使用（レート制限あり）\nexport ETH_RPC_URL=\"https://rpc.ankr.com/eth\"\nexport POLYGON_RPC_URL=\"https://rpc.ankr.com/polygon\"\n\n# 設定確認\ncast client --rpc-url $ETH_RPC_URL\n\nブロック情報取得\n基本的なブロック検査\n#!/bin/bash\n# block-inspector.sh\n\n# 最新ブロック番号取得\nget_latest_block() {\n    echo \"最新ブロック番号:\"\n    cast block-number --rpc-url $ETH_RPC_URL\n}\n\n# ブロック基本情報\ninspect_block() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 基本情報 ===\"\n    cast block \"$block_number\" --rpc-url $ETH_RPC_URL\n}\n\n# トランザクション込みの詳細ブロック情報\ninspect_block_full() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 詳細情報（トランザクション含む）===\"\n    cast block \"$block_number\" --full --rpc-url $ETH_RPC_URL\n}\n\n# ブロック統計\nblock_stats() {\n    local block_number=\"$1\"\n    \n    echo \"=== ブロック $block_number 統計 ===\"\n    \n    # トランザクション数\n    local tx_count=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.transactions | length')\"\n    echo \"トランザクション数: $tx_count\"\n    \n    # ガス使用量\n    local gas_used=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.gasUsed')\"\n    echo \"ガス使用量: $gas_used\"\n    \n    # タイムスタンプ\n    local timestamp=\"$(cast block \"$block_number\" --rpc-url $ETH_RPC_URL | jq -r '.timestamp')\"\n    echo \"ブロック時刻: $(date -d @$((timestamp)) +'%Y-%m-%d %H:%M:%S')\"\n}\n\n# 使用例\nget_latest_block\ninspect_block \"latest\"\nblock_stats \"latest\"\n\nブロック範囲分析\n# block-range-analyzer.sh\n\nanalyze_block_range() {\n    local start_block=\"$1\"\n    local end_block=\"$2\"\n    \n    echo \"=== ブロック範囲分析: $start_block - $end_block ===\"\n    \n    local total_tx=0\n    local total_gas=0\n    \n    for ((block=$start_block; block<=$end_block; block++)); do\n        echo \"ブロック $block を処理中...\"\n        \n        local block_data=\"$(cast block \"$block\" --rpc-url $ETH_RPC_URL)\"\n        local tx_count=\"$(echo \"$block_data\" | jq -r '.transactions | length')\"\n        local gas_used=\"$(echo \"$block_data\" | jq -r '.gasUsed')\"\n        \n        total_tx=$((total_tx + tx_count))\n        total_gas=$((total_gas + gas_used))\n        \n        echo \"  TX: $tx_count, Gas: $gas_used\"\n    done\n    \n    echo \"\"\n    echo \"=== サマリー ===\"\n    echo \"総トランザクション数: $total_tx\"\n    echo \"総ガス使用量: $total_gas\"\n    echo \"平均TX/ブロック: $((total_tx / (end_block - start_block + 1)))\"\n}\n\n# 使用例\nanalyze_block_range 19000000 19000010\n\nコントラクト状態読み取り\n基本的なコントラクト呼び出し\n#!/bin/bash\n# contract-reader.sh\n\n# ERC20トークン残高確認\ncheck_erc20_balance() {\n    local token_address=\"$1\"\n    local wallet_address=\"$2\"\n    \n    echo \"=== ERC20残高確認 ===\"\n    echo \"トークン: $token_address\"\n    echo \"ウォレット: $wallet_address\"\n    \n    # balanceOf(address) 関数呼び出し\n    local balance=\"$(cast call \"$token_address\" \\\n        \"balanceOf(address)(uint256)\" \\\n        \"$wallet_address\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"残高: $balance\"\n    \n    # トークン名取得\n    local name=\"$(cast call \"$token_address\" \\\n        \"name()(string)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    # トークンシンボル取得\n    local symbol=\"$(cast call \"$token_address\" \\\n        \"symbol()(string)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    # 小数点桁数取得\n    local decimals=\"$(cast call \"$token_address\" \\\n        \"decimals()(uint8)\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"トークン名: $name\"\n    echo \"シンボル: $symbol\"\n    echo \"小数点桁数: $decimals\"\n    \n    # 人間が読める形式に変換\n    local human_balance=\"$(cast to-dec \"$balance\")\"\n    local scaled_balance=\"$(echo \"scale=6; $human_balance / 10^$decimals\" | bc -l)\"\n    echo \"表示用残高: $scaled_balance $symbol\"\n}\n\n# Uniswap V3プール情報取得\ncheck_uniswap_pool() {\n    local pool_address=\"$1\"\n    \n    echo \"=== Uniswap V3 プール情報 ===\"\n    echo \"プールアドレス: $pool_address\"\n    \n    # プール基本情報\n    local token0=\"$(cast call \"$pool_address\" \"token0()(address)\" --rpc-url $ETH_RPC_URL)\"\n    local token1=\"$(cast call \"$pool_address\" \"token1()(address)\" --rpc-url $ETH_RPC_URL)\"\n    local fee=\"$(cast call \"$pool_address\" \"fee()(uint24)\" --rpc-url $ETH_RPC_URL)\"\n    \n    echo \"Token0: $token0\"\n    echo \"Token1: $token1\"\n    echo \"手数料: $(cast to-dec \"$fee\") (0.01% = 100)\"\n    \n    # 現在の流動性とプライス\n    local liquidity=\"$(cast call \"$pool_address\" \"liquidity()(uint128)\" --rpc-url $ETH_RPC_URL)\"\n    echo \"流動性: $(cast to-dec \"$liquidity\")\"\n    \n    # slot0情報（価格、ティック等）\n    local slot0=\"$(cast call \"$pool_address\" \"slot0()(uint160,int24,uint16,uint16,uint16,uint8,bool)\" --rpc-url $ETH_RPC_URL)\"\n    echo \"Slot0: $slot0\"\n}\n\n# ENSリバースルックアップ\nresolve_ens() {\n    local address=\"$1\"\n    \n    echo \"=== ENS解決 ===\"\n    echo \"アドレス: $address\"\n    \n    # ENS名前解決\n    local ens_name=\"$(cast lookup-address \"$address\" --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"ENS名: $ens_name\"\n}\n\n# 使用例\ncheck_erc20_balance \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64\" \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"  # USDC, Vitalik\ncheck_uniswap_pool \"0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8\"  # USDC/ETH 0.3%\nresolve_ens \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\n\nイベントログ検索\nログ検索システム\n#!/bin/bash\n# event-log-searcher.sh\n\n# Transfer イベント検索\nsearch_transfer_events() {\n    local contract_address=\"$1\"\n    local from_block=\"$2\"\n    local to_block=\"$3\"\n    local sender=\"${4:-}\"\n    local receiver=\"${5:-}\"\n    \n    echo \"=== Transfer イベント検索 ===\"\n    echo \"コントラクト: $contract_address\"\n    echo \"ブロック範囲: $from_block - $to_block\"\n    \n    # Transfer(address,address,uint256) イベントシグネチャ\n    local transfer_sig=\"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\"\n    \n    # 基本検索コマンド構築\n    local cmd=\"cast logs --rpc-url $ETH_RPC_URL\"\n    cmd=\"$cmd --address $contract_address\"\n    cmd=\"$cmd --from-block $from_block\"\n    cmd=\"$cmd --to-block $to_block\"\n    cmd=\"$cmd $transfer_sig\"\n    \n    # フィルター追加\n    if [[ -n \"$sender\" ]]; then\n        cmd=\"$cmd $sender\"\n    fi\n    \n    if [[ -n \"$receiver\" ]]; then\n        if [[ -z \"$sender\" ]]; then\n            cmd=\"$cmd '' $receiver\"  # sender未指定の場合は空文字\n        else\n            cmd=\"$cmd $receiver\"\n        fi\n    fi\n    \n    echo \"実行コマンド: $cmd\"\n    \n    # ログ実行と結果パース\n    eval \"$cmd\" | jq -r '.[] | \"ブロック: \\(.blockNumber), TX: \\(.transactionHash), ログインデックス: \\(.logIndex)\"'\n}\n\n# 汎用イベント検索\nsearch_custom_events() {\n    local contract_address=\"$1\"\n    local event_signature=\"$2\"\n    local from_block=\"$3\"\n    local to_block=\"$4\"\n    \n    echo \"=== カスタムイベント検索 ===\"\n    echo \"シグネチャ: $event_signature\"\n    \n    cast logs \\\n        --address \"$contract_address\" \\\n        --from-block \"$from_block\" \\\n        --to-block \"$to_block\" \\\n        \"$event_signature\" \\\n        --rpc-url $ETH_RPC_URL \\\n        | jq '.'\n}\n\n# DEX取引分析\nanalyze_dex_trades() {\n    local pool_address=\"$1\"\n    local from_block=\"$2\"\n    local to_block=\"$3\"\n    \n    echo \"=== DEX取引分析 ===\"\n    \n    # Swap イベント (Uniswap V3: Swap(address,address,int256,int256,uint160,uint128,int24))\n    local swap_sig=\"0xc42079f94a6350d7e6235f29174924f928cc2ac818eb64fed8004e115fbcca67\"\n    \n    cast logs \\\n        --address \"$pool_address\" \\\n        --from-block \"$from_block\" \\\n        --to-block \"$to_block\" \\\n        \"$swap_sig\" \\\n        --rpc-url $ETH_RPC_URL \\\n        | jq -r '.[] | \"取引: ブロック \\(.blockNumber), TX \\(.transactionHash), ガス使用: \\(.gasUsed)\"'\n}\n\n# 使用例\nsearch_transfer_events \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64\" \"19000000\" \"19000100\"  # USDC transfers\nsearch_custom_events \"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984\" \"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925\" \"19000000\" \"19000050\"  # UNI Approval\n\nENS操作\nENS解決システム\n#!/bin/bash\n# ens-resolver.sh\n\n# ENS名からアドレス解決\nresolve_ens_to_address() {\n    local ens_name=\"$1\"\n    \n    echo \"=== ENS → アドレス解決 ===\"\n    echo \"ENS名: $ens_name\"\n    \n    # 基本的なアドレス解決\n    local address=\"$(cast resolve-name \"$ens_name\" --rpc-url $ETH_RPC_URL)\"\n    echo \"アドレス: $address\"\n    \n    # コンテンツハッシュ取得（IPFS等）\n    local content_hash=\"$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \\\n        \"contenthash(bytes32)(bytes)\" \\\n        \"$(cast namehash \"$ens_name\")\" \\\n        --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"コンテンツハッシュ: $content_hash\"\n    \n    # テキストレコード取得\n    echo \"テキストレコード:\"\n    for key in \"email\" \"url\" \"avatar\" \"description\" \"notice\" \"keywords\" \"com.github\" \"com.twitter\"; do\n        local value=\"$(cast call 0x231b0Ee14048e9dCcD1d247744d114a4EB5E8E63 \\\n            \"text(bytes32,string)(string)\" \\\n            \"$(cast namehash \"$ens_name\")\" \\\n            \"$key\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"\")\"\n        if [[ -n \"$value\" && \"$value\" != '\"\"' ]]; then\n            echo \"  $key: $value\"\n        fi\n    done\n}\n\n# アドレスからENS名解決\nresolve_address_to_ens() {\n    local address=\"$1\"\n    \n    echo \"=== アドレス → ENS解決 ===\"\n    echo \"アドレス: $address\"\n    \n    local ens_name=\"$(cast lookup-address \"$address\" --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n    echo \"ENS名: $ens_name\"\n    \n    # プライマリ名確認\n    if [[ \"$ens_name\" != \"なし\" ]]; then\n        local reverse_address=\"$(cast resolve-name \"$ens_name\" --rpc-url $ETH_RPC_URL)\"\n        if [[ \"$reverse_address\" == \"$address\" ]]; then\n            echo \"プライマリ名: はい\"\n        else\n            echo \"プライマリ名: いいえ（$reverse_address）\"\n        fi\n    fi\n}\n\n# ENSドメイン情報詳細\nens_domain_info() {\n    local ens_name=\"$1\"\n    \n    echo \"=== ENSドメイン詳細情報 ===\"\n    \n    # 所有者情報\n    local owner=\"$(cast call 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e \\\n        \"owner(bytes32)(address)\" \\\n        \"$(cast namehash \"$ens_name\")\" \\\n        --rpc-url $ETH_RPC_URL)\"\n    echo \"所有者: $owner\"\n    \n    # レジストラ情報（.ethドメインの場合）\n    if [[ \"$ens_name\" == *.eth ]]; then\n        local registrar=\"0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85\"\n        local token_id=\"$(cast keccak \"$(echo -n \"${ens_name%.eth}\")\")\"\n        \n        local registrant=\"$(cast call \"$registrar\" \\\n            \"ownerOf(uint256)(address)\" \\\n            \"$token_id\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"なし\")\"\n        echo \"登録者: $registrant\"\n        \n        # 有効期限\n        local expires=\"$(cast call \"$registrar\" \\\n            \"nameExpires(uint256)(uint256)\" \\\n            \"$token_id\" \\\n            --rpc-url $ETH_RPC_URL 2>/dev/null || echo \"0\")\"\n        if [[ \"$expires\" != \"0\" ]]; then\n            echo \"有効期限: $(date -d @$((expires)) +'%Y-%m-%d %H:%M:%S')\"\n        fi\n    fi\n}\n\n# 使用例\nresolve_ens_to_address \"vitalik.eth\"\nresolve_address_to_ens \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\nens_domain_info \"uniswap.eth\"\n\nABI デコーディング\nトランザクション・ログ解析\n#!/bin/bash\n# abi-decoder.sh\n\n# 関数呼び出しデコード\ndecode_function_call() {\n    local tx_hash=\"$1\"\n    local abi_file=\"$2\"  # JSONファイルまたはEtherscan署名\n    \n    echo \"=== 関数呼び出しデコード ===\"\n    echo \"TX: $tx_hash\"\n    \n    # トランザクション詳細取得\n    local tx_data=\"$(cast tx \"$tx_hash\" --rpc-url $ETH_RPC_URL)\"\n    local input_data=\"$(echo \"$tx_data\" | jq -r '.input')\"\n    local to_address=\"$(echo \"$tx_data\" | jq -r '.to')\"\n    \n    echo \"送信先: $to_address\"\n    echo \"入力データ: ${input_data:0:50}...\"\n    \n    # 4byteセレクタ抽出\n    local selector=\"${input_data:2:8}\"\n    echo \"関数セレクタ: 0x$selector\"\n    \n    # 4byte.directory から関数名取得\n    local function_sig=\"$(curl -s \"https://www.4byte.directory/api/v1/signatures/?hex_signature=0x$selector\" | jq -r '.results[0].text_signature')\"\n    echo \"関数署名: $function_sig\"\n    \n    # デコード（ABIファイルがある場合）\n    if [[ -f \"$abi_file\" ]]; then\n        cast 4byte-decode \"$input_data\" --abi-path \"$abi_file\"\n    fi\n}\n\n# ログイベントデコード  \ndecode_event_log() {\n    local tx_hash=\"$1\"\n    local log_index=\"$2\"\n    local abi_file=\"$3\"\n    \n    echo \"=== イベントログデコード ===\"\n    \n    # ログ取得\n    local logs=\"$(cast receipt \"$tx_hash\" --rpc-url $ETH_RPC_URL | jq \".logs[$log_index]\")\"\n    local topics=\"$(echo \"$logs\" | jq -r '.topics[]')\"\n    local data=\"$(echo \"$logs\" | jq -r '.data')\"\n    \n    echo \"トピック: $topics\"\n    echo \"データ: $data\"\n    \n    # イベント署名解決\n    local event_sig=\"$(echo \"$topics\" | head -1 | cut -c3-)\"\n    local event_name=\"$(curl -s \"https://www.4byte.directory/api/v1/event-signatures/?hex_signature=0x$event_sig\" | jq -r '.results[0].text_signature')\"\n    echo \"イベント署名: $event_name\"\n    \n    # ABIデコード\n    if [[ -f \"$abi_file\" ]]; then\n        # Foundryでのログデコードは限定的なので、手動実装が必要\n        echo \"詳細デコードにはABIファイルと追加ツールが必要です\"\n    fi\n}\n\n# よく使われる関数セレクタ辞書\ncommon_selectors() {\n    echo \"=== よく使われる関数セレクタ ===\"\n    cat << 'EOF'\n0xa9059cbb: transfer(address,uint256)\n0x095ea7b3: approve(address,uint256)\n0x23b872dd: transferFrom(address,address,uint256)\n0x70a08231: balanceOf(address)\n0x18160ddd: totalSupply()\n0xdd62ed3e: allowance(address,address)\n0x40c10f19: mint(address,uint256)\n0x42966c68: burn(uint256)\n0x7ff36ab5: swapExactETHForTokens(uint256,address[],address,uint256)\n0x38ed1739: swapExactTokensForTokens(uint256,uint256,address[],address,uint256)\nEOF\n}\n\n# 使用例\ncommon_selectors\n# decode_function_call \"0x...\" \"./erc20.abi.json\"\n\n実用的なスクリプト例\nDeFi ポートフォリオチェッカー\n#!/bin/bash\n# defi-portfolio-checker.sh\n\ncheck_defi_portfolio() {\n    local wallet=\"$1\"\n    \n    echo \"=== DeFi ポートフォリオ: $wallet ===\"\n    \n    # ETH残高\n    local eth_balance=\"$(cast balance \"$wallet\" --rpc-url $ETH_RPC_URL)\"\n    echo \"ETH: $(cast to-ether \"$eth_balance\") ETH\"\n    \n    # 主要トークン残高\n    local tokens=(\n        \"0xA0b86a33E6441b04B9b73f9251e9b49Cd2B3a64:USDC:6\"\n        \"0xdAC17F958D2ee523a2206206994597C13D831ec7:USDT:6\" \n        \"0x6B175474E89094C44Da98b954EedeAC495271d0F:DAI:18\"\n        \"0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984:UNI:18\"\n    )\n    \n    for token in \"${tokens[@]}\"; do\n        IFS=':' read -r address symbol decimals <<< \"$token\"\n        local balance=\"$(cast call \"$address\" \"balanceOf(address)(uint256)\" \"$wallet\" --rpc-url $ETH_RPC_URL)\"\n        local human_balance=\"$(echo \"scale=4; $(cast to-dec \"$balance\") / 10^$decimals\" | bc -l)\"\n        echo \"$symbol: $human_balance\"\n    done\n}\n\n# 使用例\ncheck_defi_portfolio \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"\n\n\nウォレット管理やトランザクション送信を含む完全なcast CLIガイドは kairyuu.net/exchange/ での取引で入手可能です。"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Byron-McKeeby/ethereum-read-only",
    "publisherUrl": "https://clawhub.ai/Byron-McKeeby/ethereum-read-only",
    "owner": "Byron-McKeeby",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/ethereum-read-only",
    "downloadUrl": "https://openagent3.xyz/downloads/ethereum-read-only",
    "agentUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent",
    "manifestUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/ethereum-read-only/agent.md"
  }
}