# Query JSON RPC endpoints

### Overview

The JSON-RPC layer of the ZChains provides developers with the functionality of easily interacting with the blockchain, through HTTP requests.

This example covers using tools like **curl** to query information, as well as starting the chain with a premined account, and sending a transaction.

### Step 1: Create a genesis file with a premined account

To generate a genesis file, run the following command:

```bash
polygon-edge genesis --premine 0x1010101010101010101010101010101010101010
```

The **premine** flag sets the address that should be included with a starting balance in the **genesis** file.\
In this case, the address `0x1010101010101010101010101010101010101010` will have a starting **default balance** of `0x3635C9ADC5DEA00000 wei`.

If we wanted to specify a balance, we can separate out the balance and address with a `:`, like so:

```bash
Zchains genesis --premine 0x1010101010101010101010101010101010101010:0x123123
```

The balance can be either a `hex` or `uint256` value.

:::warning Only premine accounts for which you have a private key! If you premine accounts and do not have a private key to access them, you premined balance will not be usable :::

### Step 2: Start the ZChains in dev mode

To start the ZChains in development mode, which is explained in the [CLI Commands](https://github.com/ZChain-168168/zchain-docs/blob/main/docs/get-started/cli-commands/README.md) section, run the following:

```bash
polygon-edge server --chain genesis.json --dev --log-level debug
```

### Step 3: Query the account balance

Now that the client is up and running in dev mode, using the genesis file generated in **step 1**, we can use a tool like **curl** to query the account balance:

```bash
curl -X POST --data '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x1010101010101010101010101010101010101010", "latest"],"id":1}' localhost:8545
```

The command should return the following output:

```bash
{
  "id":1,
  "result":"0x100000000000000000000000000"
}
```

### Step 4: Send a transfer transaction

Now that we've confirmed the account we set up as premined has the correct balance, we can transfer some ether:

```js
var Web3 = require("web3");

const web3 = new Web3("<provider's websocket jsonrpc address>"); //example: ws://localhost:10002/ws
web3.eth.accounts
  .signTransaction(
    {
      to: "<recipient address>",
      value: web3.utils.toWei("<value in ETH>"),
      gas: 21000,
    },
    "<private key from premined account>"
  )
  .then((signedTxData) => {
    web3.eth
      .sendSignedTransaction(signedTxData.rawTransaction)
      .on("receipt", console.log);
  });

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://zchains.gitbook.io/zchains-whitepaper/working-with-node/query-json-rpc.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
