From zero to your first contract.
Install the tools, connect to QENOVRA Public Testnet, compile Solidity and deploy with your own test wallet.
1. Canonical network
Network: QENOVRA Public Testnet Chain ID: 7992501 RPC: https://rpc-testnet.qenovra.com Explorer: https://explorer.qenovra.com Native test asset: tQEN Decimals: 18
2. Install Node.js for Hardhat
Install the current Node.js LTS release. On Windows, use the official installer and keep “Add to PATH” enabled. Then close and reopen PowerShell/Terminal and verify:
node -v npm -v
Windows PowerShell users can use npm.cmd -v if their local execution policy blocks npm.ps1.
3. Install Git
Hardhat's project dependencies can include Git-based packages. If Git is missing, npm may fail with spawn git ENOENT or path git.
Windows:
winget install --id Git.Git -e
Or install Git for Windows from the official installer. After installation, close and reopen PowerShell/Terminal, then verify:
git --version
4. Install Hardhat
Create a clean project directory:
mkdir qenovra-hardhat-test cd qenovra-hardhat-test npm init -y npm install --save-dev hardhat npx hardhat --init
When Hardhat asks which major version to use, choose Hardhat 3. Keep the default project directory unless you intentionally want another folder.
Download the QENOVRA templates below. Put ProjectGreeter.sol in the project's contracts/ folder.
The sample template pins Solidity 0.8.26, EVM shanghai, optimizer enabled with 200 runs, RPC https://rpc-testnet.qenovra.com, and Chain ID 7992501. 0.8.26 is the sample/reference compiler, not a mandatory chain-wide version. Existing projects may keep another compatible Solidity version; explicitly target shanghai on the current QENOVRA Public Testnet and verify source with the exact compiler version used for deployment.
If the starter contracts require a newer Solidity pragma, move them out of contracts/ or update them before compiling with the QENOVRA profile. The downloadable ProjectGreeter.sol is compatible with Solidity 0.8.26.
Windows PowerShell 5.1 note: Set-Content -Encoding utf8 can write a UTF-8 BOM. Some Solidity toolchains may reject that invisible prefix at line 1. Prefer the downloadable source file, or write Solidity files with UTF-8 without BOM using [System.IO.File]::WriteAllText(..., (New-Object System.Text.UTF8Encoding($false))).
Compile:
npx hardhat compile
Windows ARM64 note: if Hardhat reports HHE27 and asks for @nomicfoundation/solidity-analyzer-win32-arm64-msvc, check your Node architecture:
node -p process.arch
The current Solidity analyzer publishes a Windows x64 native binary but not a Windows arm64 binary. On Windows ARM64, use one of these supported paths instead of repeatedly reinstalling optional dependencies:
Option A — easiest on Windows ARM64 Install the Windows x64 Node.js LTS build (runs under Windows x64 emulation) node -p process.arch # should print: x64 npm install npx hardhat compile Option B — WSL2 Use an ARM64 Linux distro in WSL2, where the analyzer has a linux-arm64 binary.
Do not try to install a nonexistent @nomicfoundation/solidity-analyzer-win32-arm64-msvc package manually.
Use Hardhat's encrypted keystore for the no-value testnet deployer key. The value is entered locally and should never be pasted into a website, chat, source file or Git repository:
npx hardhat keystore set QENOVRA_PRIVATE_KEY
If Hardhat says QENOVRA_PRIVATE_KEY already exists in the production keystore, that is not an error. Keep the existing value if it belongs to the intended no-value testnet wallet. Use --force only when you intentionally want to replace that stored key.
Create ignition/modules/ProjectGreeterModule.ts from the downloadable template, then deploy:
npx hardhat ignition deploy ignition/modules/ProjectGreeterModule.ts --network qenovraTestnet
Confirm the target network is Chain ID 7992501. After deployment, Hardhat prints the contract address. Open that address in the QENOVRA Explorer and confirm the transaction and bytecode.
Hardhat build-info note: artifact layouts can differ across Hardhat 3 releases and plugins. Do not assume a fixed filename such as *.input.json. For Explorer Standard JSON verification, inspect the JSON files under artifacts/build-info and use either the file that is already a Solidity Standard JSON input (language, sources, settings) or the embedded input object when present.
Then prove the full local developer flow with a read → write → read interaction. Download the example script, place it under scripts/, update the contract address if needed, and run:
npx hardhat run scripts/interact-project-greeter.ts --network qenovraTestnet
The expected output shows the value before the write, the transaction hash, the confirmed block, and the updated value after the write.
5. Install Foundry
On macOS, Linux or WSL, install Foundry using its official installer:
curl -L https://getfoundry.sh/install | bash export PATH="$PATH:$HOME/.foundry/bin" echo 'export PATH="$PATH:$HOME/.foundry/bin"' >> ~/.bashrc foundryup
If foundryup says command not found immediately after installation, the binary is installed but the current shell does not yet include $HOME/.foundry/bin; run the export PATH=... line above.
Confirm the canonical QENOVRA RPC before creating or deploying a project:
cast chain-id --rpc-url https://rpc-testnet.qenovra.com # expected: 7992501 cast block-number --rpc-url https://rpc-testnet.qenovra.com # expected: current live block height
Then initialize a project:
forge init qenovra-foundry-test cd qenovra-foundry-test
Replace the starter contract with the sample contract under src/, use the supplied foundry.toml, then run forge build. The sample template pins Solidity 0.8.26, Shanghai and optimizer 200, and exposes the RPC alias qenovra_testnet. For your own project, use the Solidity compiler version required by your source/dependencies, keep evm_version = "shanghai" for the current QENOVRA testnet, and later verify with the exact compiler build actually used.
Import a dedicated no-value testnet wallet into Foundry's encrypted local keystore without putting the private key into shell history:
cast wallet import qenovra-testnet --interactive cast wallet list
If cast wallet list already shows qenovra-testnet (Local), do not import it again. A repeated import will correctly report that the keystore file already exists. If a password attempt is incorrect, simply retry the command that needs the account and enter the correct local keystore password; do not delete or overwrite the keystore unless you intentionally want to replace the account.
Then deploy with the local keystore account. --broadcast is required to actually send the transaction; without it Forge only performs a dry run:
forge create src/ProjectGreeter.sol:ProjectGreeter \ --rpc-url https://rpc-testnet.qenovra.com \ --account qenovra-testnet \ --broadcast
Forge prompts for the encrypted keystore password locally. Never paste the private key into documentation, chat, source code or Git.
After deployment and Cast read/write testing, Foundry can submit source verification directly to the QENOVRA Blockscout verifier:
forge verify-contract <CONTRACT_ADDRESS> src/ProjectGreeter.sol:ProjectGreeter \ --chain 7992501 \ --compiler-version v0.8.26+commit.8a97fa7a \ --verifier blockscout \ --verifier-url 'https://explorer.qenovra.com/api?' \ --watch
The sample project configuration supplies Shanghai and optimizer-200 settings. Replace the --compiler-version value with the exact compiler build used by your own project. If direct verification is unavailable, use Explorer → Contract → Verify & publish with Solidity Standard JSON input generated from the same build.
6. Prefer a browser?
The Contract Studio can upload single or multi-file Solidity projects, compile, deploy, read/write functions and jump to Explorer verification without installing Hardhat or Foundry.
7. Verification checklist
After deployment, save the transaction hash and contract address, confirm them in Explorer, and verify source using the exact compiler version, EVM version, optimizer settings, file paths and source content used for deployment.