jpskill.com
🛠️ 開発・MCP コミュニティ

Solidityコーディング規約

solidity-coding

Solidityコントラクトの作成、編集、レビューを行う際に、バージョン、命名規則、ライブラリ選択、Chainlink統合、アンチパターンなどを網羅的にカバーするSkillです。

📜 元の英語説明(参考)

[AUTO-INVOKE] MUST be invoked BEFORE writing or modifying any Solidity contract (.sol files). Covers pragma version, naming conventions, project layout, OpenZeppelin library selection standards, Chainlink integration, and anti-patterns. Trigger: any task involving creating, editing, or reviewing .sol source files.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Solidityコントラクトの作成、編集、レビューを行う際に、バージョン、命名規則、ライブラリ選択、Chainlink統合、アンチパターンなどを網羅的にカバーするSkillです。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o solidity-coding.zip https://jpskill.com/download/5971.zip && unzip -o solidity-coding.zip && rm solidity-coding.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/5971.zip -OutFile "$d\solidity-coding.zip"; Expand-Archive "$d\solidity-coding.zip" -DestinationPath $d -Force; ri "$d\solidity-coding.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して solidity-coding.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → solidity-coding フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Solidity コーディング規約

言語ルール

  • 常にユーザーが使用している言語と同じ言語で応答してください。 ユーザーが中国語で質問した場合は中国語で、英語で質問した場合は英語で応答します。

コーディング原則

  • Pragma: pragma solidity ^0.8.20; を使用します。プロジェクト内のすべてのファイルで一貫性を保ってください。
  • Dependencies: OpenZeppelin Contracts 4.9.x を使用し、remappings.txt を介してインポートを管理します。
  • Error Handling: require 文字列よりもカスタムエラーを優先します。ガスを節約し、より表現力豊かです。
    • 定義: error InsufficientBalance(uint256 available, uint256 required);
    • 使用: if (balance < amount) revert InsufficientBalance(balance, amount);
  • Documentation: すべての public / external 関数には NatSpec (@notice, @param, @return) が必要です。
  • Event Indexing: address 型のパラメータにのみ indexed を追加します。他の型をインデックス化する場合はコメントを追加してください。
  • Special Keywords: immutable / constant / unchecked / assembly には、その理由を説明するインラインコメントが必要です。

命名規則

要素 規則
コントラクト / ライブラリ PascalCase MyToken, StakingPool
インターフェース I + PascalCase IMyToken, IStakingPool
状態変数 / 関数 lowerCamelCase totalSupply, claimDividend
定数 / イミュータブル UPPER_SNAKE_CASE MAX_SUPPLY, ROUTER_ADDRESS
イベント PascalCase (過去形) TokenTransferred, PoolCreated
カスタムエラー PascalCase InsufficientBalance, Unauthorized
関数パラメータ セッターには _ をプレフィックスとして付ける function setFee(uint256 _fee)
  • 禁止: ピンイン名、単一文字変数 (ループ内の i/j/k を除く)、過度な略語

コード構成ルール

状況 ルール
クロスコントラクト定数 src/common/Const.sol に配置
インターフェース定義 src/interfaces/I<Name>.sol に配置し、実装とは分離
シンプルなオンチェーンクエリ cast call または cast send を使用
複雑な多段階操作 forge script を使用
インポートスタイル 名前付きインポートを使用: import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

プロジェクトディレクトリ構造

src/              — コントラクトのソースコード
  interfaces/     — インターフェース定義 (I*.sol)
  common/         — 共有定数、型、エラー (Const.sol, Types.sol)
test/             — テストファイル (*.t.sol)
script/           — デプロイおよびインタラクションスクリプト (*.s.sol)
config/           — ネットワーク設定、パラメータ (*.json)
deployments/      — デプロイ記録 (latest.env)
docs/             — ドキュメント、変更履歴
lib/              — 依存関係 (forge install で管理)

設定管理

  • config/*.json — ネットワーク RPC URL、コントラクトアドレス、ビジネスパラメータ
  • deployments/latest.env — 最新のデプロイ済みコントラクトアドレス。デプロイごとに更新する必要があります。
  • foundry.toml — コンパイラバージョン、オプティマイザ設定、リマッピング
  • 重要な設定変更は PR の説明に文書化する必要があります。

OpenZeppelin ライブラリ選択基準

Solidity コントラクトを作成する際は、カスタム実装よりも実績のある OpenZeppelin ライブラリの使用を優先してください。シナリオに基づいて適切なライブラリを選択します。

アクセス制御

シナリオ ライブラリ インポートパス
単一オーナー管理 Ownable @openzeppelin/contracts/access/Ownable.sol
オーナー移転に安全性が求められる Ownable2Step @openzeppelin/contracts/access/Ownable2Step.sol
複数ロール権限 (admin/operator/minter) AccessControl @openzeppelin/contracts/access/AccessControl.sol
ロールメンバーを列挙する必要がある AccessControlEnumerable @openzeppelin/contracts/access/AccessControlEnumerable.sol
タイムロック遅延を伴うガバナンス TimelockController @openzeppelin/contracts/governance/TimelockController.sol

ルール: 単一オーナー → Ownable2Step; 2つ以上のロール → AccessControl; ガバナンス/DAO → TimelockController

セキュリティ保護

シナリオ ライブラリ 使用方法
外部呼び出し / トークン転送 ReentrancyGuard nonReentrant 修飾子を追加
緊急一時停止が必要 Pausable ユーザー向け関数に whenNotPaused を追加。管理者関数は一時停止しないままにする
ERC20 トークンインタラクション SafeERC20 生の呼び出しではなく safeTransfer / safeTransferFrom / safeApprove を使用

ルール: トークンまたは ETH を転送するコントラクトはすべて ReentrancyGuard + SafeERC20 を使用する必要があります。

トークン標準

シナリオ ライブラリ 注記
ファンジブルトークン ERC20 基本標準
焼却メカニズムを持つトークン ERC20Burnable burn()burnFrom() を追加
最大供給量上限を持つトークン ERC20Capped totalSupply <= cap を強制
ガスレス承認 (EIP-2612) ERC20Permit ユーザーの承認トランザクションガスを節約
ガバナンス投票トークン ERC20Votes スナップショットベースの投票力
NFT ERC721 基本 NFT 標準
列挙可能な NFT ERC721Enumerable tokenOfOwnerByIndex クエリをサポート
マルチトークン (FT + NFT 混合) ERC1155 ゲームアイテム、バッチ操作

ユーティリティライブラリ

シナリオ ライブラリ 使用方法
ホワイトリスト / エアドロップ検証 MerkleProof ガス効率の良いマークルツリー検証
署名検証 ECDSA + EIP712 オフチェーン署名 + オンチェーン検証
自動インクリメント ID Counters トークン ID、注文 ID 生成
バッチ関数呼び出し Multicall 1つのトランザクションで複数の操作
アドレスセット / uint セット EnumerableSet O(1) で追加/削除/包含が可能な反復可能なセット
収益分配 PaymentSplitter ETH/トークン支払いをシェアで分割
標準化されたイールドボールト ERC4626 DeFi ボールト標準

コントラクトアップグレード

シナリオ ライブラリ 注記
アップグレード可能なコントラクト (ガス効率が良い) UUPSUpgradeable 実装コントラクト内のアップグレードロジック
アップグレード可能なコントラクト (管理者分離) `T
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Solidity Coding Standards

Language Rule

  • Always respond in the same language the user is using. If the user asks in Chinese, respond in Chinese. If in English, respond in English.

Coding Principles

  • Pragma: Use pragma solidity ^0.8.20; — keep consistent across all files in the project
  • Dependencies: OpenZeppelin Contracts 4.9.x, manage imports via remappings.txt
  • Error Handling: Prefer custom errors over require strings — saves gas and is more expressive
    • Define: error InsufficientBalance(uint256 available, uint256 required);
    • Use: if (balance < amount) revert InsufficientBalance(balance, amount);
  • Documentation: All public / external functions must have NatSpec (@notice, @param, @return)
  • Event Indexing: Only add indexed to address type parameters — add comment if indexing other types
  • Special Keywords: immutable / constant / unchecked / assembly must have inline comment explaining why

Naming Conventions

Element Convention Example
Contract / Library PascalCase MyToken, StakingPool
Interface I + PascalCase IMyToken, IStakingPool
State variable / Function lowerCamelCase totalSupply, claimDividend
Constant / Immutable UPPER_SNAKE_CASE MAX_SUPPLY, ROUTER_ADDRESS
Event PascalCase (past tense) TokenTransferred, PoolCreated
Custom Error PascalCase InsufficientBalance, Unauthorized
Function parameter prefix _ for setter function setFee(uint256 _fee)
  • Forbidden: Pinyin names, single-letter variables (except i/j/k in loops), excessive abbreviations

Code Organization Rules

Situation Rule
Cross-contract constants Place in src/common/Const.sol
Interface definitions Place in src/interfaces/I<Name>.sol, separate from implementation
Simple on-chain queries Use cast call or cast send
Complex multi-step operations Use forge script
Import style Use named imports: import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";

Project Directory Structure

src/              — Contract source code
  interfaces/     — Interface definitions (I*.sol)
  common/         — Shared constants, types, errors (Const.sol, Types.sol)
test/             — Test files (*.t.sol)
script/           — Deployment & interaction scripts (*.s.sol)
config/           — Network config, parameters (*.json)
deployments/      — Deployment records (latest.env)
docs/             — Documentation, changelogs
lib/              — Dependencies (managed by forge install)

Configuration Management

  • config/*.json — network RPC URLs, contract addresses, business parameters
  • deployments/latest.env — latest deployed contract addresses, must update after each deployment
  • foundry.toml — compiler version, optimizer settings, remappings
  • Important config changes must be documented in the PR description

OpenZeppelin Library Selection Standards

When writing Solidity contracts, prioritize using battle-tested OpenZeppelin libraries over custom implementations. Select the appropriate library based on the scenario:

Access Control

Scenario Library Import Path
Single owner management Ownable @openzeppelin/contracts/access/Ownable.sol
Owner transfer needs safety Ownable2Step @openzeppelin/contracts/access/Ownable2Step.sol
Multi-role permission (admin/operator/minter) AccessControl @openzeppelin/contracts/access/AccessControl.sol
Need to enumerate role members AccessControlEnumerable @openzeppelin/contracts/access/AccessControlEnumerable.sol
Governance with timelock delay TimelockController @openzeppelin/contracts/governance/TimelockController.sol

Rule: Single owner → Ownable2Step; 2+ roles → AccessControl; governance/DAO → TimelockController

Security Protection

Scenario Library Usage
External call / token transfer ReentrancyGuard Add nonReentrant modifier
Emergency pause needed Pausable Add whenNotPaused to user-facing functions; keep admin functions unpaused
ERC20 token interaction SafeERC20 Use safeTransfer / safeTransferFrom / safeApprove instead of raw calls

Rule: Any contract that transfers tokens or ETH MUST use ReentrancyGuard + SafeERC20

Token Standards

Scenario Library Notes
Fungible token ERC20 Base standard
Token with burn mechanism ERC20Burnable Adds burn() and burnFrom()
Token with max supply cap ERC20Capped Enforces totalSupply <= cap
Gasless approval (EIP-2612) ERC20Permit Saves users approve tx gas
Governance voting token ERC20Votes Snapshot-based voting power
NFT ERC721 Base NFT standard
NFT with enumeration ERC721Enumerable Supports tokenOfOwnerByIndex queries
Multi-token (FT + NFT mixed) ERC1155 Game items, batch operations

Utility Libraries

Scenario Library Usage
Whitelist / airdrop verification MerkleProof Gas-efficient Merkle tree verification
Signature verification ECDSA + EIP712 Off-chain sign + on-chain verify
Auto-increment IDs Counters Token ID, order ID generation
Batch function calls Multicall Multiple operations in one tx
Address set / uint set EnumerableSet Iterable sets with O(1) add/remove/contains
Revenue sharing PaymentSplitter Split ETH/token payments by shares
Standardized yield vault ERC4626 DeFi vault standard

Contract Upgrade

Scenario Library Notes
Upgradeable contract (gas efficient) UUPSUpgradeable Upgrade logic in implementation contract
Upgradeable contract (admin separated) TransparentUpgradeableProxy Upgrade logic in proxy, higher gas
Initializer (replace constructor) Initializable Use initializer modifier instead of constructor

Rule: New projects prefer UUPSUpgradeable; always use Initializable for upgradeable contracts

Chainlink Integration

Scenario Library Notes
Token price data AggregatorV3Interface Only for tokens with Chainlink feed; check data.chain.link
Verifiable randomness (lottery/NFT) VRFConsumerBaseV2 On-chain provably fair random numbers
Automated execution (cron jobs) AutomationCompatible Replace centralized keepers
Cross-chain messaging CCIP Cross-chain token/message transfer

Library Selection Decision Flow

Does contract handle user funds/tokens?
├── YES → Add ReentrancyGuard + SafeERC20
│         Does it need emergency stop?
│         ├── YES → Add Pausable
│         └── NO  → Skip
└── NO  → Skip

How many admin roles needed?
├── 1 role  → Ownable2Step
├── 2+ roles → AccessControl
└── DAO/governance → TimelockController

Does contract need price data?
├── Token has Chainlink feed → AggregatorV3Interface
├── No Chainlink feed → Custom TWAP with min-liquidity check
└── No price needed → Skip

Will contract need upgrades?
├── YES → UUPSUpgradeable + Initializable
└── NO  → Standard deployment (immutable)

Anti-Patterns (Do NOT)

  • Do NOT write custom transfer wrappers — use SafeERC20
  • Do NOT write custom access control modifiers — use Ownable / AccessControl
  • Do NOT write custom pause logic — use Pausable
  • Do NOT use SafeMath on Solidity >= 0.8.0 — overflow checks are built-in
  • Do NOT use require(token.transfer(...)) — use token.safeTransfer(...) via SafeERC20
  • Do NOT use tx.origin for auth — use msg.sender with Ownable / AccessControl

Foundry Quick Reference

# Create new project
forge init <project-name>

# Install dependency
forge install OpenZeppelin/openzeppelin-contracts@v4.9.6

# Build contracts
forge build

# Format code
forge fmt

# Update remappings
forge remappings > remappings.txt