# Using Web3.js

## Introduction <a href="#introduction" id="introduction"></a>

This guide walks through the process of using [web3.js](https://github.com/ethereum/web3.js/) to manually sign and send a transaction to a CLV standalone node. For this example, we will use Node.js and straightforward JavaScript code.

The guide assumes that you have a local CLV node running in `--dev` mode. You can find instructions to set up a local CLV node [here](https://clover-network.gitbook.io/portal/quick-start/local-node/setting-up-a-node).

## Prerequisites <a href="#checking-prerequisites" id="checking-prerequisites"></a>

#### 1. Start CLV node

Start your standalone CLV node, which can successfully produce blocks in your local environment.

#### 2. Install Node.js and NPM

To install Node.js (we'll go for v12.x, you can choose other versions, such as the latest version v15.x)  and NPM package manager. You can do this by running the following commands in your terminal:

For Mac users:

```
brew update
brew install node
```

For Debian users:

```
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
sudo apt-get install -y nodejs
```

For Centos/Redhat users:

```
curl -sL https://deb.nodesource.com/setup_12.x | sudo bash -
sudo yum install nodejs
```

We can verify that everything installed correctly by querying the version for each package:

```
node -v
npm -v
```

#### 3. Create your Node.js project

You can create a repository on your local environment by running:

```
mkdir clover-web3 && cd clover-web3/
npm init --yes
npm install web3 --save
```

## Query Balance

We can easily do this by leveraging the Ethereum compatibility features of CLV.

First let's create a file *balance.js* under the project we've created. Here we just query the balance of the genesis account, and the genesis account is endowed with **10,000,000** ETH by your local CLV node under the development mode. To get the balances of the account, we need to make an asynchronous function that uses the `web3.eth.getBalance(address)` command. We can take advantage of the `web3.utils.fromWei()` function to transform the balance into a more readable number in ETH.

The file looks like this:

```typescript
const Web3 = require('web3')

const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:9933'));
const GENESIS_ACCOUNT = '0xe6206C7f064c7d77C6d8e3eD8601c9AA435419cE';

async function getBalance(account) {
  const balance = await web3.eth.getBalance(account);
  const balanceOfEther = web3.utils.fromWei(balance, "ether");
  console.log(`${account} has balance: ${balanceOfEther} ETH`);
}

getBalance(GENESIS_ACCOUNT);
```

#### Running the Script

You can run the above script using command :

```
node balance.js
```

The output of the execution is as following:

![](/files/-MPsATkYN08OpGK5Xc1S)

## Send Transaction

For our example, we only need a single JavaScript file (arbitrarily named *transaction.js*) to create and send the transaction, which we will run using the `node` command in the terminal. The script will transfer 100 CLV from the genesis account to another address. For simplicity, the file is divided into three sections: variable definition, create transaction, and send transaction.

We need to set a couple of values in the variable definitions, then construct and sign the transaction:

1. Create your Web3 constructor (`Web3`).
2. Specify the received address, CLV amount, gas price and gas limit.
3. Sign the transaction and broadcast it the CLV chain

The code looks like:

```javascript
const Web3 = require('web3')

const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:9933'));
const GENESIS_ACCOUNT = '0xe6206C7f064c7d77C6d8e3eD8601c9AA435419cE';

async function webTransfer(account, etherValue) {
  try {
    const before = await web3.eth.getBalance(account);
    console.log(`before transfer: ${account}, has balance ${web3.utils.fromWei(before, "ether")}`);

    const nonce = await web3.eth.getTransactionCount(GENESIS_ACCOUNT);
    const signedTransaction = await web3.eth.accounts.signTransaction({
      from: GENESIS_ACCOUNT,
      to: account,
      value: web3.utils.toWei(etherValue.toString(), "ether"),
      gasPrice: web3.utils.toWei("100", "gwei"),
      gas: "0x5208",
      nonce: nonce
    }, 'your private key configured somewhere');
    await web3.eth.sendSignedTransaction(signedTransaction.rawTransaction);
    const after = await web3.eth.getBalance(account);
    console.log(`after transfer: ${account}, has balance ${web3.utils.fromWei(after, "ether")}`);
    return { success: true };
  } catch (e) {
    return { success: false, message: e.toString() };
  }
}

webTransfer('0x1874FC5f915aa9Fd24C379fE7F9ec40607CEf78A', 100).then(console.log)
```

#### Running the Script

You can run the above script using command :

```
node transaction.js
```


---

# 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://docs.clv.org/clv-chain-developer-guide/using-local-node/using-web3js.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.
