# 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.

###

####


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://stylus-1.gitbook.io/stylusguide/3.-your-first-smart-contract-hello-world/writing-the-hello-world-contract.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
