アカウント抽象化(ERC-4337)スキル。UserOperation、Paymaster、 スマートアカウント(Safe/Kernel/Biconomy)、セッションキーの設計パターンを提供する。 ユーザーが "AA", "アカウント抽象化", "ERC-4337", "UserOperation", "Paymaster", "スマートアカウント", "セッションキー", "ガスレス", "web3-account-abstraction" 等と言った時に使用。
ERC-4337 に基づくアカウント抽象化の設計パターン、スマートアカウント実装、Paymaster 統合、セッションキー管理を提供するスキル。ガスレストランザクション、ソーシャルリカバリー、バッチトランザクション等のユースケースを対象とする。
ユーザー
│
├─ UserOperation 作成
│
▼
Bundler (alt-mempool)
│
├─ UserOp をバンドル
│
▼
EntryPoint コントラクト (singleton)
│
├─ validateUserOp() → Smart Account
├─ validatePaymasterUserOp() → Paymaster (optional)
└─ execute() → Smart Account → Target Contract
| コンポーネント | 役割 | オンチェーン/オフチェーン |
|---|---|---|
| Smart Account | ユーザーのウォレット(コントラクト) | オンチェーン |
| EntryPoint | UserOp のバリデーション・実行を管理 | オンチェーン(singleton) |
| Paymaster |
| ガス代を代払いする |
| オンチェーン |
| Bundler | UserOp を収集・バンドル・送信 | オフチェーン |
| Account Factory | Smart Account のデプロイ | オンチェーン |
UserOperation {
sender // Smart Account アドレス
nonce // リプレイ防止
initCode // 初回: Factory + 作成データ / 以降: 空
callData // 実行する関数呼び出し
callGasLimit // 実行時ガスリミット
verificationGasLimit // バリデーション時ガスリミット
preVerificationGas // Bundler へのオーバーヘッド補償
maxFeePerGas
maxPriorityFeePerGas
paymasterAndData // Paymaster アドレス + 検証データ
signature // Smart Account の署名
}
ユーザーの要件から AA のユースケースを判定する:
| ユースケース | 必要コンポーネント | 参照リファレンス |
|---|---|---|
| ガスレストランザクション | Paymaster | references/paymaster-patterns.md |
| ソーシャルリカバリー | Smart Account(Guardian) | references/smart-account-patterns.md |
| セッションキー(自動実行) | Session Key Module | references/session-keys.md |
| バッチトランザクション | Smart Account(executeBatch) | references/erc4337-core.md |
| ERC20 でガス支払い | Token Paymaster | references/paymaster-patterns.md |
検証ゲート: ユースケースが上記のいずれかに該当すること。該当しない場合は AskUserQuestion で要件を明確化する。AA が不要な場合(通常の EOA で十分な場合)はその旨を伝える。
プロジェクト要件に基づきスマートアカウント実装を選択する:
| 実装 | 特徴 | 推奨ケース |
|---|---|---|
| Safe (旧 Gnosis Safe) | 最も実績あり。モジュラー設計。マルチシグ対応 | エンタープライズ、高セキュリティ要件 |
| Kernel (ZeroDev) | 軽量。プラグイン型。低ガスコスト | DeFi、ゲーム、高頻度操作 |
| Biconomy Smart Account | SDK が充実。導入が容易 | 迅速なプロトタイプ、モバイルアプリ |
| Simple Account (eth-infinitism) | リファレンス実装。最小構成 | 学習・検証、カスタム実装のベース |
references/smart-account-patterns.md を読み込み、選択した実装の詳細パターンを確認する。
判断が不明な場合: AskUserQuestion で「セキュリティ重視 vs 開発速度重視」「マルチシグ必要性」を確認する。
検証ゲート: スマートアカウント実装が決定し、対応する SDK / ライブラリがプロジェクトにインストール可能であること。
Step 1-2 の結果に基づき、必要なリファレンスを読み込む:
| リファレンス | 読み込む条件 |
|---|---|
references/erc4337-core.md | 常に読み込む(基礎知識) |
references/paymaster-patterns.md | ガスレス / ERC20 支払いを実装する場合 |
references/smart-account-patterns.md | スマートアカウントのカスタマイズが必要な場合 |
references/session-keys.md | セッションキー / 自動実行を実装する場合 |
検証ゲート: erc4337-core.md が正常に読み込めること。
initCode の構成callData のエンコード(execute / executeBatch)paymasterAndData 設定eth_sendUserOperation RPC コールweb3-frontend スキルの wagmi / viem パターンと組み合わせる検証ゲート: UserOperation が Bundler に受理され、EntryPoint で実行されること。テストネット(Sepolia)で検証する。
検証ゲート: テストネットで全ユースケースが正常動作すること。
ユーザー入力: 「ユーザーがガス代を払わなくて済むようにしたい」
アクション:
erc4337-core.md + paymaster-patterns.md を読み込みpaymasterAndData を UserOp に付与結果: ユーザーは ETH を持っていなくても NFT をミントできる。ガス代は dApp の Paymaster が負担。
ユーザー入力: 「ブロックチェーンゲームで、毎回署名しなくて済むようにしたい」
アクション:
erc4337-core.md + session-keys.md を読み込み結果: 初回のみマスターキーで署名。以降はセッションキーで自動署名され、ゲーム操作がシームレス。
ユーザー入力: 「秘密鍵を紛失してもアカウントを復旧できるようにしたい」
アクション:
erc4337-core.md + smart-account-patterns.md を読み込み結果: ユーザーは秘密鍵を紛失しても、Guardian 2/3 の承認で新しい鍵に切り替えられる。
症状: Bundler が AA2x エラーコードを返す
原因と対策:
validateUserOp が revert した。署名が正しいか、nonce が正しいか確認する。getNonce() で最新の nonce を取得して使用する。nonce はキー付き(2D nonce)のため、キーの選択も確認する。症状: eth_sendUserOperation が接続エラーまたは 4xx を返す
原因と対策:
症状: AA31 (paymaster deposit too low) エラー
原因と対策:
entryPoint.balanceOf(paymasterAddress) で残高を確認する。entryPoint.depositTo(paymasterAddress) で ETH を追加する。症状: initCode を含む最初の UserOp が失敗する
原因と対策:
initCode の先頭 20 バイトが正しい Factory アドレスか確認する。getAddress() で既存アカウントの有無を確認する。verificationGasLimit が Factory のデプロイコストを含んでいるか確認する。初回は通常より多いガスが必要。症状: executeBatch の一部操作が revert するが、全体が失敗する
原因と対策:
executeBatch はアトミック(1つ失敗で全体失敗)。意図的な動作。eth_estimateUserOperationGas で事前に全操作のシミュレーションを行い、失敗する操作を除外する。solidity-core のセキュリティパターンを参照する。web3-frontend スキルの viem / wagmi パターンを参照する。