setup-cairo-contracts
Original:🇺🇸 English
Translated
Set up a Cairo smart contract project with OpenZeppelin Contracts for Cairo on Starknet. Use when users need to: (1) create a new Scarb/Starknet project, (2) add OpenZeppelin Contracts for Cairo dependencies to Scarb.toml, (3) configure individual or umbrella OpenZeppelin packages, or (4) understand Cairo import conventions and component patterns for OpenZeppelin.
2installs
Added on
NPX Install
npx skill4agent add openzeppelin/openzeppelin-skills setup-cairo-contractsTags
Translated version includes tags in frontmatterSKILL.md Content
View Translation Comparison →Cairo Setup
Project Scaffolding
Install toolchain and create a project:
bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.sh | sh
scarb new my_project --test-runner=starknet-foundryThis scaffolds a complete Starknet project with testing preconfigured.
snforgeOpenZeppelin Dependencies
Look up the current version from https://docs.openzeppelin.com/contracts-cairo before adding. Add to :
Scarb.tomlFull library (umbrella package):
toml
[dependencies]
openzeppelin = "<VERSION>"Individual packages (faster builds — only compiles what you use):
toml
[dependencies]
openzeppelin_token = "<VERSION>"
openzeppelin_access = "<VERSION>"Available individual packages: , , , , , , , , , , , .
openzeppelin_accessopenzeppelin_accountopenzeppelin_financeopenzeppelin_governanceopenzeppelin_interfacesopenzeppelin_introspectionopenzeppelin_merkle_treeopenzeppelin_presetsopenzeppelin_securityopenzeppelin_tokenopenzeppelin_upgradesopenzeppelin_utilsandopenzeppelin_interfacesare versioned independently. Check the docs for their specific versions. All other packages share the same version.openzeppelin_utils
Import Conventions
The import path depends on which dependency is declared:
- Umbrella package (): use
openzeppelin = "..."as the rootopenzeppelin:: - Individual packages (): use the package name as the root
openzeppelin_token = "..."
cairo
// 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 macro, embedded impls, and substorage:
component!cairo
component!(path: ERC20Component, storage: erc20, event: ERC20Event);
#[abi(embed_v0)]
impl ERC20MixinImpl = ERC20Component::ERC20MixinImpl<ContractState>;
impl ERC20InternalImpl = ERC20Component::InternalImpl<ContractState>;