mcpField
S
setup-cairo-contracts

setup-cairo-contracts

github.com/openzeppelinDevelopment219205 installsUpdated 2d ago
Repository

About setup-cairo-contracts

A setup skill for Cairo and Starknet contract projects, aimed at developers starting a project with OpenZeppelin Contracts for Cairo. It covers scaffolding, dependency selection, and imports, including both umbrella and individual packages.

Key features

  1. 01Scaffold Starknet project with snforge
  2. 02Add OpenZeppelin dependencies
  3. 03Choose umbrella or individual packages
  4. 04Apply package-specific import paths

Use cases

  1. 01Starting a Starknet contract project
  2. 02Adding OpenZeppelin components to Scarb.toml

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/openzeppelin/openzeppelin-skills --skill setup-cairo-contracts

After installing, type/setup-cairo-contractsin Claude Code to confirm it loaded.

Details

From the project README

Cairo Setup

Project Scaffolding

Install toolchain and create a project:

curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.sh | sh
scarb new my_project --test-runner=starknet-foundry

This scaffolds a complete Starknet project with snforge testing preconfigured.

OpenZeppelin Dependencies

Look up the current version from https://docs.openzeppelin.com/contracts-cairo before adding. Add to Scarb.toml:

Full library (umbrella package):

[dependencies]
openzeppelin = "<VERSION>"

Individual packages (faster builds — only compiles what you use):

[dependencies]
openzeppelin_token = "<VERSION>"
openzeppelin_access = "<VERSION>"

Available individual packages: 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 and openzeppelin_utils are versioned independently. Check the docs for their specific versions. All other packages share the same version.

Import Conventions

The import path depends on which dependency is declared:

  • Umbrella package (openzeppelin = "..."): use openzeppelin:: as the root
  • Individual packages (openzeppelin_token = "..."): use the package name as the root
// 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;

Components are integrated via the component! macro, embedded impls, and substorage:

component!(path: ERC20Component, storage: erc20, event: ERC20Event);

#[abi(embed_v0)]
impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl<ContractState>;
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;

Comments

Markdown supported