From openzeppelin-skills
Sets up Rust Stylus smart contract projects with OpenZeppelin for Arbitrum: toolchain install, Cargo project creation, dependencies, imports, storage patterns, build/deploy.
How this skill is triggered — by the user, by Claude, or both
Slash command
/openzeppelin-skills:setup-stylus-contractsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Install the Rust toolchain and WASM target:
Install the Rust toolchain and WASM target:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup target add wasm32-unknown-unknown
Install the Cargo Stylus CLI:
cargo install --force cargo-stylus
Create a new Stylus project:
cargo stylus new my_project
A Rust nightly toolchain is required. The project should include a
rust-toolchain.tomlspecifying the nightly channel,rust-srccomponent, andwasm32-unknown-unknowntarget. Check the rust-contracts-stylus repo for the current recommended nightly date.
Look up the current version from crates.io/crates/openzeppelin-stylus before adding. Add to Cargo.toml:
[dependencies]
openzeppelin-stylus = "=<VERSION>"
Enable the export-abi feature flag for ABI generation:
[features]
export-abi = ["openzeppelin-stylus/export-abi"]
The crate must be compiled as both a library and a cdylib:
[lib]
crate-type = ["lib", "cdylib"]
Imports use openzeppelin_stylus (underscores) as the crate root:
use openzeppelin_stylus::token::erc20::{Erc20, IErc20};
use openzeppelin_stylus::access::ownable::{Ownable, IOwnable};
use openzeppelin_stylus::utils::pausable::{Pausable, IPausable};
use openzeppelin_stylus::utils::introspection::erc165::IErc165;
Contracts use #[storage] and #[entrypoint] on the main struct, embedding OpenZeppelin components as fields:
#[entrypoint]
#[storage]
struct MyToken {
erc20: Erc20,
ownable: Ownable,
}
Public methods are exposed with #[public] and #[implements(...)]. The canonical pattern uses an empty impl block for dispatch registration, plus separate trait impl blocks:
#[public]
#[implements(IErc20<Error = erc20::Error>, IOwnable<Error = ownable::Error>)]
impl MyToken {}
#[public]
impl IErc20 for MyToken {
type Error = erc20::Error;
// delegate to self.erc20 ...
}
Top-level modules: access, finance, proxy, token, utils.
Validate the contract compiles to valid Stylus WASM:
cargo stylus check
Export the Solidity ABI:
cargo stylus export-abi
Deploy to an Arbitrum Stylus endpoint:
cargo stylus deploy --endpoint="<RPC_URL>" --private-key-path="<KEY_FILE>"
npx claudepluginhub openzeppelin/openzeppelin-skills --plugin openzeppelin-skillsSets up Stellar/Soroban smart contract projects with OpenZeppelin Contracts. Covers CLI/Rust toolchain install, project init, Cargo.toml dependencies, import conventions, and contract patterns.
Authors Cairo smart contracts on Starknet, including storage, events, interfaces, and OpenZeppelin component composition with security patterns.
Guides writing production-grade Solidity smart contracts with defensive patterns, custom errors, fuzz testing, and structured code layout.