DEV Community

EgorMajj
EgorMajj

Posted on • Edited on

Deploying a smart contract on the ZkSync Era test network

Image description
Minimum server requirements
1 CPUs, 1 GB RAM, 30 GB SSD, 32 TB Traffic, Ubuntu 20.04

I use Contabo
https://contabo.com

Deploying a smart contract

Updating system

sudo apt update
sudo apt upgrade

When installing, press y

Install the curl boot loader
sudo apt install -y curl

Running the installation script for Node.js 18 (LTS)
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
Installing Node.js 18
sudo apt install -y nodejs
We execute the commands one at a time
mkdir greeter-example
cd greeter-example
apt install cmdtest
Press y

PRC Official Source: https://era.zksync.io/docs/dev/fundamentals/interacting.html#connecting-to-zksync-era-on-metamask:~:text=Testnet%20network%20info

Adding the ZkSync Era Network to the Metamask: https://chainlist.org/?search=zkSync+Era+test&testnets=true

or manually

Network Name: zkSync Era Testnet
New RPC URL: https://zksync2-testnet.zksync.dev
Chain ID: 280
Currency Symbol: ETH
Block Explorer URL: https://goerli.explorer.zksync.io/
WebSocket URL: wss://zksync2-testnet.zksync.dev/ws

PRC Official Source: https://era.zksync.io/docs/dev/fundamentals/interacting.html#connecting-to-zksync-era-on-metamask:~:text=Testnet%20network%20inf

Bridging test tokens from Goerli to the ZkSync Era network: https://portal.zksync.io/bridge

Execute commands
npm init --y
npm install --save-dev hardhat
npm install -g npm@9.6.0
npx hardhat

Select Create a TypeScript project, then Enter and several times y

Execute commands
mkdir greeter
cd greeter
npm init -y

npm add -D typescript ts-node @types/node ethers@^5.7.2 zksync-web3@^0.13.1 @ethersproject/hash @ethersproject/web hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy

vim hardhat.config.ts

After opening the page, press i to edit and type the script below

import "@matterlabs/hardhat-zksync-deploy";
import "@matterlabs/hardhat-zksync-solc";

module.exports = {
  zksolc: {
    version: "1.3.1",
    compilerSource: "binary",
    settings: {},
  },
  defaultNetwork: "zkTestnet",
  networks: {
    zkTestnet: {
      url: "https://zksync2-testnet.zksync.dev", // URL of the zkSync network RPC
      ethNetwork: "goerli", // Can also be the RPC URL of the Ethereum network (e.g. `https://goerli.infura.io/v3/<API_KEY>`)
      zksync: true,
    },
  },
  solidity: {
    version: "0.8.17",
  },
};
Enter fullscreen mode Exit fullscreen mode

Execute commands
mkdir contracts
mkdir deploy
vim contracts/Greeter.sol

After opening the page, press i to edit and type the script below

//SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;

contract Greeter {
    string private greeting;

    constructor(string memory _greeting) {
        greeting = _greeting;
    }

    function greet() public view returns (string memory) {
        return greeting;
    }

    function setGreeting(string memory _greeting) public {
        greeting = _greeting;
    }
}
Enter fullscreen mode Exit fullscreen mode

Then press Esc and :wq

Execute commands
npx hardhat compile
vim deploy/deploy.ts

The edit page will open, press i again and paste the script below

import { utils, Wallet } from "zksync-web3";
import * as ethers from "ethers";
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { Deployer } from "@matterlabs/hardhat-zksync-deploy";

// An example of a deploy script that will deploy and call a simple contract.
export default async function (hre: HardhatRuntimeEnvironment) {
  console.log(`Running deploy script for the Greeter contract`);

  // Initialize the wallet.
  const wallet = new Wallet("<WALLET-PRIVATE-KEY>");

  // Create deployer object and load the artifact of the contract we want to deploy.
  const deployer = new Deployer(hre, wallet);
  const artifact = await deployer.loadArtifact("Greeter");

  // Deposit some funds to L2 in order to be able to perform L2 transactions.
  const depositAmount = ethers.utils.parseEther("0.001");
  const depositHandle = await deployer.zkWallet.deposit({
    to: deployer.zkWallet.address,
    token: utils.ETH_ADDRESS,
    amount: depositAmount,
  });
  // Wait until the deposit is processed on zkSync
  await depositHandle.wait();

  // Deploy this contract. The returned object will be of a `Contract` type, similarly to ones in `ethers`.
  // `greeting` is an argument for contract constructor.
  const greeting = "Hi there!";
  const greeterContract = await deployer.deploy(artifact, [greeting]);

  // Show the contract info.
  const contractAddress = greeterContract.address;
  console.log(`${artifact.contractName} was deployed to ${contractAddress}`);

  // Call the deployed contract.
  const greetingFromContract = await greeterContract.greet();
  if (greetingFromContract == greeting) {
    console.log(`Contract greets us with ${greeting}!`);
  } else {
    console.error(`Contract said something unexpected: ${greetingFromContract}`);
  }

  // Edit the greeting of the contract
  const newGreeting = "Hey guys";
  const setNewGreetingHandle = await greeterContract.setGreeting(newGreeting);
  await setNewGreetingHandle.wait();

  const newGreetingFromContract = await greeterContract.greet();
  if (newGreetingFromContract == newGreeting) {
    console.log(`Contract greets us with ${newGreeting}!`);
  } else {
    console.error(`Contract said something unexpected: ${newGreetingFromContract}`);
  }
}
Enter fullscreen mode Exit fullscreen mode

At const wallet = new Wallet(""); change to your private metamask key.

DISCLAIMER: Deploy a smart contract from a new wallet with no real funds to avoid financial loss!

Then press Esc and :wq
Execute commands
npx hardhat deploy-zksync

The text should appear

Greeter was deployed to (your metamask number)
Contract greets us with Hi there!!
Contract greets us with Hey guys!
Enter fullscreen mode Exit fullscreen mode

Go to the explorer https://goerli.explorer.zksync.io/ , enter your metamask number and we see three transactions, because after the deploy command immediately occurs and interaction with the contract.

This means that the smart-contract is deployed!

Congratulations!

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay