Solidityコーディング規約
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本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
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
$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. 下の青いボタンを押して
solidity-coding.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
solidity-codingフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
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
requirestrings — saves gas and is more expressive- Define:
error InsufficientBalance(uint256 available, uint256 required); - Use:
if (balance < amount) revert InsufficientBalance(balance, amount);
- Define:
- Documentation: All
public/externalfunctions must have NatSpec (@notice,@param,@return) - Event Indexing: Only add
indexedtoaddresstype parameters — add comment if indexing other types - Special Keywords:
immutable/constant/unchecked/assemblymust 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/kin 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 parametersdeployments/latest.env— latest deployed contract addresses, must update after each deploymentfoundry.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
transferwrappers — useSafeERC20 - Do NOT write custom access control modifiers — use
Ownable/AccessControl - Do NOT write custom pause logic — use
Pausable - Do NOT use
SafeMathon Solidity >= 0.8.0 — overflow checks are built-in - Do NOT use
require(token.transfer(...))— usetoken.safeTransfer(...)viaSafeERC20 - Do NOT use
tx.originfor auth — usemsg.senderwithOwnable/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