develop-secure-contrac…
Develop secure smart contracts using OpenZeppelin Contracts libraries. Use when users need to integrate OpenZeppelin library…
Set up a Stylus smart contract project with OpenZeppelin Contracts for Stylus on Arbitrum. Use when users need to: (1) install Rust toolchain and WASM target for Stylus, (2) create a new Cargo Stylus project, (3) add OpenZeppelin Stylus dependencies to Cargo.toml, or (4)
Claude Code
$ npx -y skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts --agent claude-code
Codex
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a codex -y
Cursor
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a cursor -y
Gemini CLI
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a gemini-cli -y
GitHub Copilot
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a github-copilot -y
OpenCode
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a opencode -y
Windsurf
$ npx skills add OpenZeppelin/openzeppelin-skills --skill setup-stylus-contracts -a windsurf -y
name: setup-stylus-contracts description: "Set up a Stylus smart contract project with OpenZeppelin Contracts for Stylus on Arbitrum. Use when users need to: (1) install Rust toolchain and WASM target for Stylus, (2) create a new Cargo Stylus project, (3) add OpenZeppelin Stylus dependencies to Cargo.toml, or (4) understand Stylus import conventions and storage patterns for OpenZeppelin." license: AGPL-3.0-only metadata: author: OpenZeppelin
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
After creating the project, verify it compiles with `cargo stylus check` (see Build & Deploy section below).
> A Rust nightly toolchain is required. The project should include a `rust-toolchain.toml` specifying the nightly channel, `rust-src` component, and `wasm32-unknown-unknown` target. Check the [rust-contracts-stylus repo](https://github.com/OpenZeppelin/rust-contracts-stylus) for the current recommended nightly date.
Look up the current version from [crates.io/crates/openzeppelin-stylus](https://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`.
> Do NOT use plain `cargo check` or `cargo build`, since Stylus contracts require the `cargo stylus` CLI for correct WASM compilation.
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>"
Agent skills for secure smart contract development with OpenZeppelin Contracts libraries and migration of Defender workflows.
Develop secure smart contracts using OpenZeppelin Contracts libraries. Use when users need to integrate OpenZeppelin library…
Migrate OpenZeppelin Defender Actions, Autotasks, Monitors and scheduled or Relayer-backed workflows to Chainlink CRE. Use when…
Review Sui Move code that integrates OpenZeppelin Contracts for Sui against the library's own patterns and conventions. Use this…
Set up a Cairo smart contract project with OpenZeppelin Contracts for Cairo on Starknet. Use when users need to: (1) create a new…
Set up a Solidity smart contract project with OpenZeppelin Contracts. Use when users need to: (1) create a new Hardhat or Foundry…
Set up a Stellar/Soroban smart contract project with OpenZeppelin Contracts for Stellar. Use when users need to: (1) install…
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.