# KAI Integration for Exchanges

Related Documents:JSON API [here](https://github.com/kardiachain/go-kardia/wiki/Kardia-JSON-RPC-API) ,JSON RPC APIs examples [here](https://documenter.getpostman.com/view/8826990/TVRhcpMT),JavaScript SDK, Kardia\_Golang\_SDK.

Public Mainnet RPC endpoint: <https://rpc.kardiachain.io>

## **Initialize**

### &#x20;   **Javascript:**

&#x20;   KardiaChain JavaScript SDK is published at [npm](https://www.npmjs.com/package/kardia-js-sdk). The installation guide and examples are available there, we need the RPC endpoint of KardiaChain Mainnet to interact with these modules.<br>

```javascript
import KardiaClient from 'kardia-js-sdk';

const endpoint = "https://rpc.kardiachain.io";
const kardiaClient = new KardiaClient({ endpoint });
```

###

### &#x20;   **Golang:**&#x20;

&#x20;   [Kardia Golang SDK](https://github.com/kardiachain/go-kaiclient/tree/v1.0.0) provides the same set of interacting tools in Golang. We also need the RPC endpoint of KardiaChain mainnet to initialize the SDK.<br>

```javascript
func SetupKAIClient(rpcURL string) (*Node, context.Context, error) {
  ctx, _ := context.WithCancel(context.Background())
  cfg := zapdriver.NewProductionConfig()
  logger, err := cfg.Build()
  if err != nil {
    return nil, nil, fmt.Errorf("Failed to create logger: %v", err)
  }
  node, err := NewNode(rpcURL, lgr)
  if err != nil {
    logger.Warn("cannot connect to RPC url", rpcURL)
    return nil, nil, fmt.Errorf("Failed to dial to RPC URL: %v", err)
  }
  return node, ctx, nil
}

node, _, err := SetupKAIClient("https://rpc.kardiachain.io")
```

## **Blocks**

### &#x20;   **Block Info API:**

&#x20;    We can get blocks’ info including header and transactions/receipts using kai\_getBlockByNumber and kai\_getBlockByHash APIs.

####

#### &#x20;   **REQUEST PARAMS**

&#x20;   kai\_getBlockByNumber: QUANTITY|TAG - integer of a block number, or the string "earliest", "latest" or "pending".\
&#x20;   kai\_getBlockByHash: DATA, 32 Bytes - hash of a block.<br>

&#x20;   **RESPONSE**

&#x20;   kai\_getBlockByNumber POST body and response:

```javascript
{
    "jsonrpc": "2.0",
    "method": "kai_getBlockByNumber",
    "params": [
        1427011
    ],
    "id": 1
}
```

```javascript
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "hash": "0x30c1f5453e74cf076615f36b6b61427d8dc6e719ed2dcd50aa4a06a90c74b341",
        "height": 1427011,
        "lastBlock": "0x01c0e73f93a697e66ec4bd95bfbe6f0fa16a367eeef2fbe6f51a92c56efdcd14",
        "commitHash": "0x08ac8406b5d94aac6381036cd2c524e0aa3aeddd025bf2487926fc85a3e8d2d5",
        "time": "2021-03-23T11:12:16.81455482Z",
        "numTxs": 1,
        "gasLimit": 200000000,
        "gasUsed": 51859,
        "rewards": "14335139256888646354",
        "proposerAddress": "0x79B598b9AD8f0C1ed987014FE644Cc73C7b72035",
        "dataHash": "0x433f81b1480cdc3b19670ea4f5112f768f59e5027c3b52f5e1dbbd1bd5e18d5d",
        "receiptsRoot": "",
        "logsBloom": "",
        "validatorHash": "0x97dda26c0d13ececbd9f8ee53d2597c6047d8b8b4ab53ff131b57d4c25503f38",
        "nextValidatorHash": "0x97dda26c0d13ececbd9f8ee53d2597c6047d8b8b4ab53ff131b57d4c25503f38",
        "consensusHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "appHash": "0xf0879b3d44298dbdbf2a3dcfd4bc268e5332fbacbbd7a1e56a847a87033c3191",
        "evidenceHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "txs": [
            {
                "blockHash": "0x30c1f5453e74cf076615f36b6b61427d8dc6e719ed2dcd50aa4a06a90c74b341",
                "blockNumber": 1427011,
                "time": "2021-03-23T11:12:16.81455482Z",
                "from": "0x2D2C6517Dc89E8347eEAEcCe0f3a71B5c6b0a172",
                "gas": 3000000,
                "gasPrice": 1000000000,
                "hash": "0xbe49290b71ad5acbd75a471352df69e39d8c49fc7b209dbbb5cab5681fef3320",
                "input": "0xf0acd7d5",
                "nonce": 103,
                "to": "0xF512B1e8acc96Baf05b470182f1814Bfb14DF563",
                "transactionIndex": 0,
                "value": "0",
                "logsBloom": [...],
            }
        ],
        "receipts": [
            {
                "transactionHash": "0xbe49290b71ad5acbd75a471352df69e39d8c49fc7b209dbbb5cab5681fef3320",
                "gasUsed": 51859,
                "cumulativeGasUsed": 51859,
                "contractAddress": "0x",
                "logs": [
                    {
                        "address": "0xF512B1e8acc96Baf05b470182f1814Bfb14DF563",
                        "topics": [
                            "0x15490ebb4bc37fd11febf8b4a71b7bed47ac2d66d82fbdd5c83da3f202726eed"
                        ],
                        "data": "0000000000000000000000002d2c6517dc89e8347eeaecce0f3a71b5c6b0a1720000000000000000000000000000000000000000000000000000000000000000",
                        "blockHeight": 1427011,
                        "transactionHash": "0xbe49290b71ad5acbd75a471352df69e39d8c49fc7b209dbbb5cab5681fef3320",
                        "transactionIndex": 0,
                        "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                        "logIndex": 1,
                        "removed": false
                    }
                ],
                "root": "0x",
                "status": 1
            }
        ]
    }
}
```

**Notes:** *The status of a transaction in the txs array is reflected in the status field of the corresponding response in the receipts array. If the value of the status field is 1, this transaction is successfully applied, otherwise the transaction is failed to execute if the value of this field is 0 or if there is no receipt for this transaction hash.*<br>

kai\_getBlockByHash parameters and response are similar to the above code.

**Notes:** *The txs array contains transactions of a block, the receipts array contains corresponding receipts of the transactions in block, including status of them*.<br>

### &#x20;   **Javascript SDK**

```javascript
const BLOCK_NUMBER = "latest";
const block = await kardiaClient.kaiChain.getBlockByBlockNumber(
      BLOCK_NUMBER
);
```

```javascript
const BLOCK_HASH = "0xd3fd9a6e3d7bc200b9fa9aacf768ebf1f30a7a656bba4a2d4af31996762f9308";
const block = await kardiaClient.kaiChain.getBlockByHash(
      BLOCK_HASH
);
```

###

### &#x20;   **Go KaiClient**

```javascript
blockNumber := "latest"
block, err := node.BlockByHeight(ctx, blockNumber)
if err != nil {
 return
}
```

```javascript
blockHash := "0xd3fd9a6e3d7bc200b9fa9aacf768ebf1f30a7a656bba4a2d4af31996762f9308"
b, err := node.BlockByHash(ctx, blockHash)
if err != nil {
 return
}
```

## **Sending transactions**

### &#x20;   **Sending Transaction**

### &#x20;   **Response**

&#x20;    tx\_sendRawTransaction POST body and response:

```javascript
{
    "jsonrpc": "2.0",  
    "method": "tx_sendRawTransaction",
    "params": [
"0xf85f800182714894990d94fef322b50c5014d88565851cd5cf0bc45373801ba0c9efea69ea237eefd5c8ee4da8f35faefa56ed8be371204d30049e5c06b27f17a03ebdf6f95633b86ceb064537bc765ff98367638ec71704bf6a8c8920ef14bed6"
    ],
    "id": 1
}
```

```javascript
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "0xc2f9e58228b1adbd3654c1cffdfc5aed0065b2bfaf1945bee64b55a0f876cdb7"
}
```

###

### &#x20;   **Javascript SDK**

```javascript
const ACCOUNT = {
  address: '0x9cD2CFa83e6d85625a64fe31779446944c024E36',
  privateKey:
    '0xc07bed6441a92d0c8b99da1c4a63a2ff1c6e233729e3bf9428eeee25b8b60996',
};

const nonce = await kardiaClient.account.getNonce(ACCOUNT.address);
const txData = {
  to: ACCOUNT.address,
  gas: 50000,
  nonce,
  gasPrice: 1,
  value: 22093,
  data: '',
};

const txHash = await kardiaClient.transaction.sendTransaction(
  txData,
  ACCOUNT.privateKey,
  true
);
```

###

### &#x20;   **Go KaiClient**

```javascript
import "github.com/kardiachain/go-kardia/types"

tx, err := types.SignTx(types.NewTransaction(
  nonce,
  toAddr,
  amount,
  DefaultGasLimit,
  defaultGasPrice,
  nil,
), senderKey)
if err != nil {
  panic(fmt.Sprintf("Fail to sign generated tx: %v", err))
}
```

## **Transactions and Receipts**

### &#x20;   **Transaction and Receipt API:**

&#x20;    We can get a transaction and the corresponding receipt using tx\_getTransaction and tx\_getTransactionReceipt APIs.<br>

&#x20;   **REQUEST PARAMS**

&#x20;   tx\_getTransaction: DATA, 32 Bytes - hash of a transaction.

&#x20;   tx\_getTransactionReceipt: DATA, 32 Bytes - hash of a transaction.<br>

#### &#x20;   **RESPONSE**

&#x20;   tx\_getTransaction POST body and response:

```javascript
{
    "jsonrpc": "2.0",  
    "method": "tx_getTransaction",
    "params": [
       "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d"
    ],
    "id": 1
}
```

```javascript
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "blockHash": "0xef0c216eebf803647a057a32dbba19ca8ad4e650225facc689d025f3dcde6590",
        "blockNumber": 1426129,
        "time": "2021-03-23T09:52:02.923640411Z",
        "from": "0x81014E4C752037D6E01E7c1E07342F6645969F9A",
        "gas": 500000,
        "gasPrice": 2,
        "hash": "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d",
        "input": "0xc7b8981c",
        "nonce": 148,
        "to": "0x4dAe614b2eA2FaeeDDE7830A2e7fcEDdAE9f9161",
        "transactionIndex": 0,
        "value": "0",
        "logsBloom": [...]
    }
}
```

#### &#x20;   **RESPONSE**

&#x20;   tx\_getTransactionReceipt POST body and response:

```javascript
{
    "jsonrpc": "2.0",  
    "method": "tx_getTransactionReceipt",
    "params": [
       "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d"
    ],
    "id": 1
}
```

```javascript
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "blockHash": "0xef0c216eebf803647a057a32dbba19ca8ad4e650225facc689d025f3dcde6590",
        "blockHeight": 1426129,
        "transactionHash": "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d",
        "transactionIndex": 0,
        "from": "0x81014E4C752037D6E01E7c1E07342F6645969F9A",
        "to": "0x4dAe614b2eA2FaeeDDE7830A2e7fcEDdAE9f9161",
        "gasUsed": 88667,
        "cumulativeGasUsed": 88667,
        "contractAddress": "0x",
        "logs": [],
        "logsBloom": [...],
        "root": "0x",
        "status": 1
    }
}
```

**Notes:** *The status of a transaction is reflected in the status field of tx\_getTransactionReceipt response. If the value of the status field is 1, this transaction is successfully applied, otherwise the transaction is failed to execute if the value of this field is 0.*<br>

### &#x20;   **Javascript SDK**

```javascript
const txHash = "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d";
const txDetail = await kardiaClient.transaction.getTransaction(txHash);
const receipt = await kardiaClient.transaction.getTransactionReceipt(txHash);
```

###

### &#x20;   **Go KaiClient**

```javascript
hash := "0x258105a566970c0665408073391ecf6112dd88422464de6c0b9fd5eae26f243d"
tx, err := node.GetTransaction(ctx, hash)
if err != nil {
 ...
}
receipt, err := node.GetTransactionReceipt(ctx, hash)
if err != nil {
 ...
}
```

## **Account Balances**

### &#x20;   **Account Balances**

#### &#x20;   **RESPONSE**

&#x20;   account\_balance POST body and response:

```javascript
{
    "jsonrpc": "2.0",
    "method": "account_balance",
    "params": [
        "0x14191195F9BB6e54465a341CeC6cce4491599ccC",
        "latest"
    ],
    "id": 1
}
```

```javascript
{
    "jsonrpc": "2.0",
    "id": 1,
    "result": "2852475404340986866629970957"
}
```

**Notes:** *The balance string is balance of address in HYDRO, 1 KAI = 1018 HYDRO***.**

###

### &#x20;   **Javascript SDK**

```javascript
const ADDRESS = '0x14191195F9BB6e54465a341CeC6cce4491599ccC';
const balanceAtHeight = await kardiaClient.account.getBalance(ADDRESS, {blockHeight: 1});
const balanceAtHash = await kardiaClient.account.getBalance(ADDRESS, {blockHash: BLOCK_HASH});
```

###

### &#x20;   **Go KaiClient**

```javascript
address := "0x14191195F9BB6e54465a341CeC6cce4491599ccC";
balance, err := node.Balance(context.Background(), address)
if err != nil {
 ...
}
```
