---
id: quickstart
title: Hello Contract
sidebar_label: Quickstart ✨
---
import {Github} from '@site/src/components/codetabs';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import MovingForwardSupportSection from '@site/src/components/MovingForwardSupportSection';
Welcome! [NEAR accounts](../../1.concepts/protocol/account-model.md) can store small apps known as smart contracts. In this quick tutorial, we will guide you in creating your first contract on the NEAR **testnet**!
Join us in creating a friendly contract that stores a greeting, and exposes functions to interact with it.
---
## Prerequisites
Before starting, make sure to set up your development environment.
Working on Windows?
See our blog post [getting started on NEAR using Windows](/blog/getting-started-on-windows) for a step-by-step guide on how to set up WSL and your environment
```bash
# Install Node.js using nvm (more options in: https://nodejs.org/en/download)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
nvm install latest
# ⚠️ For Mac Silicon users only, Rosetta is needed to compile contracts
# /usr/sbin/softwareupdate --install-rosetta --agree-to-license
# Install NEAR CLI to deploy and interact with the contract
npm install -g near-cli-rs@latest
```
```bash
# Install Rust: https://www.rust-lang.org/tools/install
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Contracts will be compiled to wasm, so we need to add the wasm target
rustup target add wasm32-unknown-unknown
# Install NEAR CLI-RS to deploy and interact with the contract
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/near-cli-rs/releases/latest/download/near-cli-rs-installer.sh | sh
# Install cargo near to help building the contract
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/near/cargo-near/releases/latest/download/cargo-near-installer.sh | sh
```
:::note
Some `near-cli` commands have two versions - a **full** one and a **short** one. If you want to explore all options provided by `near-cli` use [the interactive mode](../../4.tools/cli.md#interactive-mode).
:::
:::tip Testnet Account
There is no need to have a `testnet` account to follow this tutorial.
However, if you want to create one, you can do so through [a wallet](https://testnet.mynearwallet.com), and use it from the `near-cli` by invoking `near login`.
:::
---
## Creating the Contract
Create a smart contract by using one of the scaffolding tools and following their instructions:
```bash
npx create-near-app@latest
```
![img](@site/static/docs/hello-near-ts.gif)
_Creating a project using `create-near-app`_
This will generate a project with the following structure:
```bash
├── sandbox-test # sanbox testing
│ └── main.ava.js
├── src # contract's code
│ └── contract.ts
├── README.md
├── package.json # package manager
└── tsconfig.json
```
```bash
cargo near new
```
![img](@site/static/docs/hello-near-rs.gif)
_Creating a project using `cargo near new`_
This will generate a project with the following structure:
```bash
├── src # contract's code
│ └── lib.rs
├── tests # sandbox testing
│ └── test_basics.rs
├── Cargo.toml # package manager
├── README.md
└── rust-toolchain.toml
```
---
## The Contract
The `Hello World` smart contract stores a greeting in its state, and exposes two functions to interact with it:
1. `set_greeting`: to change the greeting
2. `get_greeting`: to fetch the greeting
:::tip
After finishing this tutorial, check our [contract's anatomy](./anatomy/anatomy.md) page to learn more about the contract's structure
:::
---
## Test the Contract
Building and testing the contract is as simple as running the `test` command. The contract will be compiled and the tests will be executed.
```bash
npm run test
````
Failing tests?
Make sure that you are using `node v18`, `v20` or `v22` - you can manage multiple versions using `nvm` - and that you have `Rosetta` installed on MacOS if you have an Apple Silicon processor.
```bash
cargo test
```
In the background, these commands are calling the build tools for each language and using a [Sandbox](./testing/integration-test.md) to test the contract.
:::tip Sandbox
Testing the contracts within a Sandbox allows you to understand how the contract will behave once deployed to the network while having total control over the testing environment.
:::
---
## Create a Testnet Account
Now that you know the contract is passing the tests, let's create a `testnet` account in which to deploy the contract. [`near-cli`](../../4.tools/cli.md) supports two versions of some commands - full and short one. It's up to you which format you prefer, but full version provides more features.
```bash
# Replace with a custom name
near create-account --useFaucet
```
Example Result
```bash
$> near create-account lovely-event.testnet --useFaucet
# New account "lovely-event.testnet" created successfully
```
```bash
# Replace with a custom name
near account create-account sponsor-by-faucet-service autogenerate-new-keypair save-to-keychain network-config testnet create
````
Example Result
```bash
$> near account create-account sponsor-by-faucet-service lovely-event.testnet autogenerate-new-keypair save-to-keychain network-config testnet create
# New account "lovely-event.testnet" created successfully
```
:::tip
Remember that you can create a named account through any wallet (i.e. [MyNearWallet](https://testnet.mynearwallet.com)) and then use it from the `near-cli` by invoking `near login`.
:::
---
## Build the Contract
When you are ready to create a build of the contract run a one-line command depending on your environment.
```bash
npm run build
```
```bash
cargo near build
```
---
## Deploy the Contract
Having our account created, we can now deploy the contract:
```bash
near deploy build/hello_near.wasm
```
```bash
near contract deploy use-file ./target/wasm32-unknown-unknown/release/hello.wasm without-init-call network-config testnet sign-with-keychain send
```
```bash
near deploy ./target/wasm32-unknown-unknown/release/hello.wasm
```
```bash
near contract deploy use-file ./target/wasm32-unknown-unknown/release/hello.wasm without-init-call network-config testnet sign-with-keychain send
```
**Congrats**! Your contract now lives in the NEAR testnet network.
---
## Interacting with the Contract
To interact with your deployed smart contract, you can call its functions through the command line.
#### Get Greeting
The `get_greeting` function only reads from the contract's state, and can thus be called for **free**.
```bash
> near view get_greeting
# "Hello"
```
```bash
> near contract call-function as-read-only get_greeting json-args {} network-config testnet now
# "Hello"
```
#### Set Greeting
The `set_greeting` method writes on the contract's [storage](./anatomy/storage.md), and thus requires a user to sign a transaction in order to be executed.
```bash
> near call set_greeting '{"greeting": "Hola"}' --accountId
# Log: Saving greeting "Hola"
```
```bash
> near contract call-function as-transaction set_greeting json-args '{"greeting": "Hola"}' prepaid-gas '100.0 Tgas' attached-deposit '0 NEAR' sign-as network-config testnet sign-with-keychain send
#Log: Saving greeting "Hola"
```
:::tip
Notice that we are signing the transaction using ``, so in this case, we are asking the contract's account to call its own function
:::
---
## Moving Forward
That's it for the quickstart tutorial. You have now seen a fully functional contract with a minimal user interface and testing.
To better understand the contract's structure, check our [contract's anatomy](./anatomy/anatomy.md) page.
If you prefer to see more examples, check our [examples](/tutorials/examples/count-near) page.
:::note Versioning for this article
At the time of this writing, this example works with the following versions:
- node: `20.18.0`
- rustc: `1.81.0`
- near-cli-rs: `0.15.1`
- cargo-near: `0.10.1`
:::