setup-cairo-contracts について
OpenZeppelin Contracts for Cairoを使う開発者向けに、CairoとStarknetのコントラクトプロジェクトの作成方法を案内します。雛形作成、依存関係の選択、包括パッケージと個別パッケージのインポート方法を扱います。
主な機能
- 01snforge設定済みStarknetプロジェクトの作成
- 02OpenZeppelin依存関係の追加
- 03包括パッケージと個別パッケージの選択
- 04パッケージ別のインポートパス適用
活用シーン
- 01Starknetコントラクトプロジェクトの開始
- 02Scarb.tomlへのOpenZeppelinコンポーネント追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ openzeppelin/ openzeppelin-skills --skill setup-cairo-contractsインストール後、Claude Code で/setup-cairo-contractsを入力して読み込まれたか確認します。
詳細
Cairo のセットアップ
プロジェクトのひな形作成
ツールチェーンをインストールし、プロジェクトを作成します。
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.sh | sh
scarb new my_project --test-runner=starknet-foundry
これにより、snforge によるテストがあらかじめ設定された Starknet プロジェクト一式が作成されます。
OpenZeppelin の依存関係
追加する前に、https://docs.openzeppelin.com/contracts-cairo で最新バージョンを確認してください。Scarb.toml に追加します。
ライブラリ全体(包括パッケージ):
[dependencies]
openzeppelin = "<VERSION>"
個別パッケージ(ビルドの高速化に役立ち、使用するものだけがコンパイルされます):
[dependencies]
openzeppelin_token = "<VERSION>"
openzeppelin_access = "<VERSION>"
利用可能な個別パッケージ:openzeppelin_access、openzeppelin_account、openzeppelin_finance、openzeppelin_governance、openzeppelin_interfaces、openzeppelin_introspection、openzeppelin_merkle_tree、openzeppelin_presets、openzeppelin_security、openzeppelin_token、openzeppelin_upgrades、openzeppelin_utils。
openzeppelin_interfacesとopenzeppelin_utilsは個別にバージョン管理されています。それぞれのバージョンはドキュメントで確認してください。その他のパッケージはすべて同じバージョンを使用します。
インポートの規則
インポートパスは、宣言されている依存関係によって異なります。
- 包括パッケージ(
openzeppelin = "..."):ルートとしてopenzeppelin::を使用します - 個別パッケージ(
openzeppelin_token = "..."):パッケージ名をルートとして使用します
// Individual packages
use openzeppelin_token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
use openzeppelin_access::ownable::OwnableComponent;
use openzeppelin_upgrades::UpgradeableComponent;
// Umbrella package equivalents
use openzeppelin::token::erc20::{ERC20Component, ERC20HooksEmptyImpl};
use openzeppelin::access::ownable::OwnableComponent;
use openzeppelin::upgrades::UpgradeableComponent;
コンポーネントは、component! マクロ、埋め込み impl、サブストレージを介して統合します。
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
#[abi(embed_v0)]
impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl<ContractState>;
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;