> For the complete documentation index, see [llms.txt](https://stylus-1.gitbook.io/stylusguide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stylus-1.gitbook.io/stylusguide/3.-your-first-smart-contract-hello-world/writing-the-hello-world-contract.md).

# Writing the Hello World Contract

## Project Setup

### Step 1: Create a New Project

Create a new project using `cargo-stylus` and navigate into the project directory:

```sh
cargo stylus new hello_world
cd hello_world
```

### Step 2: Edit `Cargo.toml`

Open the `Cargo.toml` file and add the necessary dependencies and features:

```toml
[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"

[dependencies]
stylus-sdk = { version = "0.5.2", features = ["debug"] }
wee_alloc = "0.4.5"

[features]
export-abi = ["stylus-sdk/export-abi"]

[profile.release]
codegen-units = 1
strip = true
lto = true
panic = "abort"
opt-level = "s"

[workspace]
```

### Step 3: Edit Contract Code

Open the `src/lib.rs` file and replace the content with the following code:

```rust
// Disable Rust standard library to keep the contract small.
#![no_main]
#![no_std]

// Import the necessary crates and modules.
extern crate alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

use alloc::string::String;
use alloc::vec::Vec;
use stylus_sdk::{console, stylus_proc::entrypoint, ArbResult};

// Define the entrypoint for the contract.
#[entrypoint]
fn user_main(_input: Vec<u8>) -> ArbResult {
    // Print a "Hello, world!" message to the console.
    console!("Hello, world!");
    Ok(Vec::new())
}
```

#### Explanation

* **No Standard Library**: `#![no_main]` and `#![no_std]` are used to disable the Rust standard library, which keeps the contract's WASM size small.
* **Allocator**: `wee_alloc` is a small allocator designed for WASM environments, reducing the contract's footprint.
* **Imports**: `alloc` provides heap-allocated types like `String` and `Vec`. `stylus_sdk` includes necessary macros and functions for Stylus development.
* **Entry Point**: `#[entrypoint]` defines the starting point of the contract. `console!` macro prints "Hello, world!" to the console for debugging purposes.

###

####
