> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chainstack.com/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.chainstack.com/feedback

```json
{
  "path": "/docs/zksync-era-tooling",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# zkSync Era tooling

> zkSync Era development tools guide. Use zksync-ethers SDK, Hardhat, MetaMask, web3.js, ethers.js, and Remix IDE with Chainstack zkSync Era nodes.

Get started with a [reliable zkSync Era RPC endpoint](https://chainstack.com/build-better-with-zksync-era/) to use the tools below.

## Interaction tools

### MetaMask

On [node access details](/docs/manage-your-node#view-node-access-and-credentials), click **Connect wallet**.

## Development tools

### zksync-ethers SDK

See [zksync-ethers](https://github.com/zksync-sdk/zksync-ethers).

### Hardhat

Configure [Hardhat](https://docs.zksync.io/build/tooling/hardhat/hardhat-zksync) to deploy contracts and interact through your zkSync Era nodes.

1. Install [Hardhat](https://docs.zksync.io/build/tooling/hardhat/hardhat-zksync) and create a project.

   <CodeGroup>
     ```shell Shell theme={"system"}
     yarn add -D typescript ts-node ethers@^5.7.2 zksync-web3 hardhat @matterlabs/hardhat-zksync-solc @matterlabs/hardhat-zksync-deploy @matterlabs/zksync-contracts @openzeppelin/contracts @matterlabs/hardhat-zksync-verify @nomicfoundation/hardhat-verify dotenv
     ```
   </CodeGroup>

2. Install the [dotenv](https://www.npmjs.com/package/dotenv) package to securely load your sensitive variables from a `.env` file

3. Create a new environment in `hardhat.config.ts`:

<CodeGroup>
  ```js hardhat.config.ts theme={"system"}
  import { HardhatUserConfig } from "hardhat/config";
  require("dotenv").config();

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

  const config: HardhatUserConfig = {
    zksolc: {
      version: "1.3.13", // Use latest available
      compilerSource: "binary",
      settings: {},
    },
    defaultNetwork: "zkSyncTestnet",
    networks: {
      hardhat: {
        zksync: true,
      },
      zkSyncTestnet: {
        url: process.env.ZKSYNC_TESTNET_CHAINSTACK,
        ethNetwork: "sepolia",
        zksync: true,
        verifyURL:
          "https://zksync2-testnet-explorer.zksync.dev/contract_verification",
      },
    },
    solidity: {
      version: "0.8.17",
    },
  };

  export default config;
  ```
</CodeGroup>

<Info>
  Follow the tutorial for a better understanding: [zkSync Era∎: Develop a custom paymaster contract](/docs/zksync-tutorial-develop-a-custom-paymaster-contract)
</Info>

### web3.js

Build DApps using [web3.js](https://github.com/ethereum/web3.js/) and zkSync Era nodes deployed with Chainstack.

1. Install [web3.js](https://web3js.readthedocs.io/).

2. Connect over HTTP or WebSocket.

#### HTTPS

Use the `HttpProvider` object to connect to your node HTTPS endpoint and get the latest block number:

<CodeGroup>
  ```js Javascript theme={"system"}
  const Web3 = require('web3');

  const web3 = new Web3(new Web3.providers.HttpProvider('YOUR_CHAINSTACK_ENDPOINT'));

  web3.eth.getBlockNumber().then(console.log);
  ```
</CodeGroup>

where YOUR\_CHAINSTACK\_ENDPOINT is your node HTTPS endpoint protected either with the key or password.

#### WSS

Use the `WebsocketProvider` object to connect to your node WSS endpoint and get the latest block number:

<CodeGroup>
  ```js Javascript theme={"system"}
  const Web3 = require('web3');

  const web3 = new Web3(new Web3.providers.WebsocketProvider('YOUR_CHAINSTACK_ENDPOINT'));

  web3.eth.getBlockNumber().then(console.log);
  ```
</CodeGroup>

where YOUR\_CHAINSTACK\_ENDPOINT is your node WSS endpoint protected either with the key or password.

### web3.py

Build DApps using [web3.py](https://github.com/ethereum/web3.py) and zkSync Era nodes deployed with Chainstack.

1. Install [web3.py](https://web3py.readthedocs.io/).

2. Connect over HTTP or WebSocket. See also [EVM node connection: HTTP vs WebSocket](https://support.chainstack.com/hc/en-us/articles/900002187586-Ethereum-node-connection-HTTP-vs-WebSocket).

#### HTTPS

Use `HTTPProvider` to connect to your node endpoint and get the latest block number.

<CodeGroup>
  ```py Key Protected theme={"system"}
  from web3 import Web3

  web3 = Web3(Web3.HTTPProvider('YOUR_CHAINSTACK_ENDPOINT'))
  print(web3.eth.block_number)
  ```

  ```py Password Protected theme={"system"}
  from web3 import Web3

  web3 = Web3(Web3.HTTPProvider('https://%s:%s@%s'% ("USERNAME", "PASSWORD", "HOSTNAME")))
  print(web3.eth.block_number)
  ```
</CodeGroup>

where

* YOUR\_CHAINSTACK\_ENDPOINT — your node HTTPS endpoint protected either with the key or password
* HOSTNAME — your node HTTPS endpoint hostname
* USERNAME — your node access username (for password-protected endpoints)
* PASSWORD — your node access password (for password-protected endpoints)

#### WSS

Use the `WebsocketProvider` object to connect to your node WSS endpoint and get the latest block number.

<CodeGroup>
  ```py Key Protected theme={"system"}
  from web3 import Web3

  web3 = Web3(Web3.WebsocketProvider('YOUR_CHAINSTACK_ENDPOINT'))
  print(web3.eth.block_number)
  ```

  ```py Password Protected theme={"system"}
  from web3 import Web3

  web3 = Web3(Web3.WebsocketProvider('wss://%s:%s@%s'% ("USERNAME", "PASSWORD", "HOSTNAME")))
  print(web3.eth.block_number)
  ```
</CodeGroup>

where

* YOUR\_CHAINSTACK\_ENDPOINT — your node WSS endpoint protected either with the key or password
* HOSTNAME — your node WSS endpoint hostname
* USERNAME — your node access username (for password-protected endpoints)
* PASSWORD — your node access password (for password-protected endpoints)

See also [WebSocket connection to an EVM node](https://support.chainstack.com/hc/en-us/articles/900001918763-WebSocket-connection-to-an-Ethereum-node).

### node.js

You can build a web app to query data using node.js and [axios](https://www.npmjs.com/package/axios):

<CodeGroup>
  ```js Javascript theme={"system"}
  const axios = require("axios");

  const payload = {
      jsonrpc: "2.0",
      id: 0,
      method: "eth_blockNumber",
      params: []

  };

  (async () => {
      const response = await axios.post(`YOUR_CHAINSTACK_ENDPOINT`, payload)
      console.log(response.data)
  })();
  ```
</CodeGroup>

* YOUR\_CHAINSTACK\_ENDPOINT — your Chainstack node endpoint protected either with the key or password. See node access details.
* `query` — your JSON-RPC query. In this case, to get the latest block number.

### ethers.js

Build DApps using [ethers.js](https://github.com/ethers-io/ethers.js/) and zkSync Era nodes deployed with Chainstack.

1. Install [ethers.js](https://www.npmjs.com/package/ethers).

2. Connect over HTTPS or WebSocket. See also [EVM node connection: HTTP vs WebSocket](https://support.chainstack.com/hc/en-us/articles/900002187586-Ethereum-node-connection-HTTP-vs-WebSocket).

#### HTTPS

Use the `JsonRpcProvider` object to connect to your node endpoint and get the balance of any address:

<CodeGroup>
  ```js Javascript theme={"system"}
  const ethers = require('ethers');
  const NODE_URL = "YOUR_CHAINSTACK_ENDPOINT ";
  const provider = new ethers.JsonRpcProvider(NODE_URL, NETWORK_ID);
  const eth_getBalance = async () => {
      const balance = await provider.getBalance("0x439356Ad40D2f2961c99FFED4453f482AEC453Af");
      console.log(balance);
    };
  eth_getBalance()
  ```
</CodeGroup>

where

* YOUR\_CHAINSTACK\_ENDPOINT — your node HTTPS endpoint protected either with the key or password

* NETWORK\_ID — zkSync Era network ID:

  * Mainnet: `324`
  * Sepolia Testnet:`300`

#### WebSocket

Use the `WebSocketProvider` object to connect to your node WSS endpoint and get the latest block number:

<CodeGroup>
  ```js Javascript theme={"system"}
  const ethers = require('ethers');
  const NODE_URL = "YOUR_CHAINSTACK_ENDPOINT";
  const provider = new ethers.WebSocketProvider(NODE_URL, NETWORK_ID);
  const eth_getBalance = async () => {
      const balance = await provider.getBalance("0x439356Ad40D2f2961c99FFED4453f482AEC453Af");
      console.log(balance);
    };
  eth_getBalance()
  ```
</CodeGroup>

where

* YOUR\_CHAINSTACK\_ENDPOINT — your node WSS endpoint protected either with the key or password

* NETWORK\_ID — zkSync Era network ID:

  * Mainnet: `324`
  * Sepolia Testnet:`300`

### Remix IDE

To make Remix IDE interact with the network through a zkSync Era node deployed with Chainstack:

1. Get [MetaMask](https://metamask.io/) and set it to interact through a Chainstack node. See [Interacting through MetaMask](#metamask).

2. In Remix IDE, navigate to the **Deploy** tab. Select **Injected Provider - MetaMask** in **Environment**.

This will engage MetaMask and make Remix IDE interact with the network through a Chainstack node.
