# Contrast with web3.js

`js-conflux-sdk` is Conflux network's javascript SDK, if you are familiar with Ethereum's web3.js, this guide can help you quickly know how to use `js-conflux-sdk`.

## Install

web3:

* npm: `npm install web3`
* pure js: link the `dist/web3.min.js`

js-conflux-sdk:

* npm: `npm install js-conflux-sdk`
* pure js: link the `dist/js-conflux-sdk.umd.min.js`

## Import & initialize

web3:

```js
// In Node.js use: const Web3 = require('web3');

const web3 = new Web3(Web3.givenProvider || "ws://localhost:8545");
```

js-conflux-sdk:

```js
const { Conflux } = require('js-conflux-sdk');
// In browser: const Conflux = window.TreeGraph.Conflux;

const conflux = new Conflux({
  url: "https://test.confluxrpc.com",
  networkId: 1
});
```

### Invoke client's RPC method

web3:

```js
// get balance
await web3.eth.getBalance("0x407d73d8a49eeb85d32cf465507dd71d507100c1");
// get nonce
await web3.eth.getTransactionCount("0x407d73d8a49eeb85d32cf465507dd71d507100c1");
// get block
await web3.eth.getBlock('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
// get transaction
await web3.eth.getTransaction('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
// get tx receipt
await web3.eth.getTransactionReceipt('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
```

js-conflux-sdk:

```js
// get balance
await conflux.cfx.getBalance('cfxtest:aaawgvnhveawgvnhveawgvnhveawgvnhvey1umfzwp');
// get nonce
await conflux.cfx.getNextNonce('cfxtest:aaawgvnhveawgvnhveawgvnhveawgvnhvey1umfzwp');
// get block
await conflux.cfx.getBlockByHash('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b')
// get transaction
await conflux.cfx.getTransactionByHash('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
// get tx receipt
await conflux.cfx.getTransactionReceipt('0x9fc76417374aa880d4449a1f7f31ec597f00b1f6f3dd2d66f4c9c6c445836d8b');
```

### Account manage

web3:

```js
// create
const account = web3.eth.accounts.create();
/*
{
    address: "0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01",
    privateKey: "0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709",
    signTransaction: function(tx){...},
    sign: function(data){...},
    encrypt: function(password){...}
}
*/
// import private key
web3.eth.accounts.privateKeyToAccount(privateKey);
// signTransaction
const txInfo = {
    to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
    value: '1000000000',
    gas: 2000000
};
account.signTransaction(txInfo)
web3.eth.accounts.signTransaction(txInfo, account.privateKey);
```

js-conflux-sdk:

```js
// create
const account = conflux.wallet.addRandom(privateKey);
// import private key
const account2 = conflux.wallet.addPrivateKey();
// signTransaction
const txInfo = {
    to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
    value: '1000000000',
    gas: 2000000
};
```

### Sending Transactions

web3:

```js
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
// signTransaction
const txInfo = {
    to: '0xF0109fC8DF283027b6285cc889F5aA624EaC1F55',
    value: '1000000000',
    gas: 2000000
};
const tx = await account.signTransaction(txInfo);
const hash = await web3.eth.sendRawTransaction(tx.rawTransaction);
```

js-conflux-sdk:

```js
const account = conflux.wallet.addPrivateKey(privateKey);
const hash = await conflux.cfx.sendTransaction({
  from: account.address,
  to: 'cfxtest:aaawgvnhveawgvnhveawgvnhveawgvnhvey1umfzwp',
  value: '1000000000',
  gas: 2000000
});
```

#### Tx state checker

web3:

```js
web3.eth.sendTransaction({from: '0x123...', data: '0x432...'})
.once('sending', function(payload){ ... })
.once('sent', function(payload){ ... })
.once('transactionHash', function(hash){ ... })
.once('receipt', function(receipt){ ... })
.on('confirmation', function(confNumber, receipt, latestBlockHash){ ... })
.on('error', function(error){ ... })
.then(function(receipt){
    // will be fired once the receipt is mined
});
```

js-conflux-sdk:

```js
const pendingTx = conflux.cfx.sendTransaction({
  from: 'cfxtest:123...',
  to: 'cfxtest:456...',
  value: 1
});

const hash = await pendingTx;

const tx = await pendingTx.get();

tx = await pendingTx.mined();

const receipt = await pendingTx.executed();

receipt = await pendingTx.confirmed();
```

### Interact with contract

To interact with contract, you must know it's `abi`, `bytecode`, `address`

#### Deploy contract

web3:

```js
const contract = new web3.eth.Contract(abi);

await contract.deploy({
  data: bytecode,
  arguments: [arg1, arg2]
});
```

js-conflux-sdk:

```js
const contract = conflux.Contract({
  abi,
  bytecode,
});

const hash = await contract.constructor(arg1, arg2).sendTransaction({
  from: account
});

// wait tx packed and executed

const receipt = await conflux.cfx.getTransactionReceipt(hash);

console.log('Contract address: ', receipt.contractCreated);
```

#### Call methods

web3:

```js
const contract = new web3.eth.Contract(abi, address);
let result = await contract.methods.myMethod(123).call({
  from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe',
});
```

js-conflux-sdk

```js
const contract = conflux.Contract({
  abi,
  address
});
let result = await contract.myMethod(123).call({
  from: "cfxtest:aaawgvnhveawgvnhveawgvnhveawgvnhvey1umfzwp",
});
```

#### Update contract state

web3:

```js
let receipt = await contract.methods.updateStateMethod(123).send({
  from: '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe'
});
```

js-conflux-sdk:

```js
let receipt = await contract.updateStateMethod(123).sendTransaction({
  from: "cfxtest:aaawgvnhveawgvnhveawgvnhveawgvnhvey1umfzwp"
}).executed();
```

### Utilities

#### Unit convert

web3:

```js
web3.utils.toWei('1', 'ether');
> "1000000000000000000"

web3.utils.toWei('1', 'Gwei')
> "1000000000"

web3.utils.fromWei('1', 'ether');
> "0.000000000000000001"

web3.utils.fromWei('1', 'Gwei');
> "0.000000001"
```

js-conflux-sdk:

```js
const { Drip } = require('js-conflux-sdk');

Drip.fromCFX(1).toString()
> "1000000000000000000"

Drip.fromGDrip(1).toString();
> "1000000000"

new Drip(1).toCFX();
> "0.000000000000000001"

new Drip(1).toGDrip();
> "0.000000001"
```

#### hex encoding

web3:

```js
web3.utils.toHex('234');
> "0xea"

web3.utils.toHex(234);
> "0xea"

web3.utils.toHex(new BN('234'));
> "0xea"

web3.utils.toHex(new BigNumber('234'));
> "0xea"

web3.utils.toHex('I have 100€');
> "0x49206861766520313030e282ac"
```

js-conflux-sdk:

```js
const { format } = require('js-conflux-sdk');

format.hex(234)
> '0xea'

format.hex(BigInt(123))
> '0x7b'

format.hex(Buffer.from('hello world'))
> '0x68656c6c6f20776f726c64'
```

#### keccak

web3:

```js
web3.utils.sha3('234'); // taken as string
> "0xc1912fee45d61c87cc5ea59dae311904cd86b84fee17cc96966216f811ce6a79"
```

js-conflux-sdk:

```js
format.keccak256(Buffer.from('234'))
> "0xc1912fee45d61c87cc5ea59dae311904cd86b84fee17cc96966216f811ce6a79"
```

####


---

# 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://confluxnetwork.gitbook.io/js-conflux-sdk/jssdk-vs-web3.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.
