> For the complete documentation index, see [llms.txt](https://zona-protocol.gitbook.io/About-us/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zona-protocol.gitbook.io/About-us/smart-contract-development/deploying-to-zona-with-hardhat.md).

# Deploying to ZONA with Hardhat

**Hardhat** is one of the most popular development environments for Ethereum. Since ZONA is EVM-compatible, you can use Hardhat to compile, test, and deploy your smart contracts to **ZONA Testnet or Mainnet**  with minimal configuration changes.

***

#### ✅ Prerequisites

Make sure you have:

* Node.js installed (v14+)
* A wallet with ZONA testnet tokens
* `MetaMask` or a private key ready
* RPC/Chain ID details (once available)

***

#### 1. 📦 Create a Hardhat Project

If you haven’t already, initialize a new Hardhat project:

```bash
mkdir zona-hardhat && cd zona-hardhat
npm init -y
npm install --save-dev hardhat
npx hardhat
```

Choose **“Create a basic sample project”** when prompted.

***

#### 2. 🧱 Install Dependencies

For deploying and interacting with contracts:

```bash
npm install --save-dev @nomicfoundation/hardhat-toolbox dotenv
```

Create a `.env` file:

```env
PRIVATE_KEY=your_private_key_without_0x
```

***

#### 3. ⚙️ Configure ZONA Network

In your `hardhat.config.js` file, add the ZONA network:

```js
jrequire("@nomicfoundation/hardhat-toolbox");
require("dotenv").config();

module.exports = {
  solidity: "0.8.20",
  networks: {
    zonaTestnet: {
      url: "https://rpc-testnet.zonaprotocol.org", // Replace with actual RPC
      chainId: 9999,                                // Replace with actual Chain ID
      accounts: [`0x${process.env.PRIVATE_KEY}`]
    }
  }
};
```

> Replace the RPC URL and chain ID once ZONA Testnet details are finalized.

***

#### 4. ✍️ Write Your Contract

In `contracts/`, create `ZonaToken.sol`:

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ZonaToken is ERC20 {
    constructor(uint256 initialSupply) ERC20("ZonaToken", "ZONA") {
        _mint(msg.sender, initialSupply);
    }
}
```

***

#### 5. 📜 Create a Deployment Script

In `scripts/deploy.js`:

```js
async function main() {
  const ZonaToken = await ethers.getContractFactory("ZonaToken");
  const token = await ZonaToken.deploy(ethers.utils.parseEther("1000000"));
  await token.deployed();
  console.log(`ZonaToken deployed to: ${token.address}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
```

***

#### 6. 🚀 Deploy to ZONA Testnet

Run:

```bash
npx hardhat run scripts/deploy.js --network zonaTestnet
```

If successful, you'll see:

```bash
ZonaToken deployed to: 0xYourContractAddress
```

***

#### ✅ What’s Next?

* Verify your contract on ZONA Explorer *(Coming Soon)*
* Interact with your contract via CLI, Web3.js, or front-end
* Share testnet contract with your community

***

> You're now building on ZONA  fast, scalable, and developer-first.
