setup-stylus-contracts

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.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "setup-stylus-contracts" with this command: npx skills add openzeppelin/openzeppelin-skills/openzeppelin-openzeppelin-skills-setup-stylus-contracts

Stylus Setup

Rust & Cargo Stylus Setup

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.toml specifying the nightly channel, rust-src component, and wasm32-unknown-unknown target. Check the rust-contracts-stylus repo for the current recommended nightly date.

Adding OpenZeppelin Dependencies

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"]

Import Conventions

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.

Build & Deploy Basics

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>"

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

setup-solidity-contracts

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

develop-secure-contracts

No summary provided by upstream source.

Repository SourceNeeds Review
General

upgrade-solidity-contracts

No summary provided by upstream source.

Repository SourceNeeds Review
General

setup-stellar-contracts

No summary provided by upstream source.

Repository SourceNeeds Review