---
# System prepended metadata

title: Client Module of Bandchain.js
tags: [Client library]

---

---
tags: Client library
order: 3
---

# Client Module of Bandchain.js

This module provides functionalities to query data from BandChain and broadcast transactions to BandChain. It uses gRPC-web behind the scene which interact with gRPC-web proxy server.

## gRPC Errors

When there are gRPC related errors, that is, gRPC status code is not `OK`, the `Promise` result will be rejected with an `ServiceError` object with following fields.

| Fields     | Type             | Description           |
| ---------- | ---------------- | --------------------- |
| `message`  | `string`         | error message         |
| `code`     | `number`         | gRPC status code      |
| `metadata` | `BrowserHeaders` | gRPC trailer metadata |

## `getChainId`

Get BandChain's Chain ID

#### Return

- `Promise<string>` - Chain ID

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

(async () => {
  console.log(await client.getChainId());
})();
```

#### Result

```
band-laozi-testnet2
```

---

## `getLatestBlock`

Get BandChain's latest block detail

#### Return

- [`Block`] - BandChain's latest block

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

(async () => {
  console.log(await client.getLatestBlock());
})();
```

#### Result

```json=
{
  "blockId": {
    "hash": "Di1p0sWqEz/l4aVxlJX0fgVrX5eJYAb5t8cmar45fcg=",
    "partSetHeader": {
      "total": 1,
      "hash": "bqKyTzMQd9fnDfS9IdBjf+0FOfynv96YqsalsSQ1f0g="
    }
  },
  "block": {
    "header": {
      "version": {
        "block": 11,
        "app": 0
      },
      "chainId": "band-laozi-testnet2",
      "height": 488306,
      "time": {
        "seconds": 1625718430,
        "nanos": 770011739
      },
      "lastBlockId": {
        "hash": "s65ZLJIfoZau9ETSMyqYWTjTCsgB8zFgOMuwOUHhKkU=",
        "partSetHeader": {
          "total": 1,
          "hash": "4w05KvzYXCVH84P2uZ6jXduvwo+r/Bc+xhh/454T/Gs="
        }
      },
      "lastCommitHash": "9nqVW5rgPve3VGg9R8s49DjmsK5/xmG0d6gmGhcWxBQ=",
      "dataHash": "4ViOMq7cJxVBSCgclZfUqg0k0SbvVM6tj75rhNOfO3Q=",
      "validatorsHash": "rYFx2BfEhW8duRLFgJ4GZqjXKLH/r95+2Wu3Nn+J1zE=",
      "nextValidatorsHash": "rYFx2BfEhW8duRLFgJ4GZqjXKLH/r95+2Wu3Nn+J1zE=",
      "consensusHash": "ek5k0qm1ziK3XpVuICUnTcA7aEbM13JRUqa8DQcn4z4=",
      "appHash": "00/PMV2HlF+Ih69p+q5AHwRt6hqlvo5dtm/blBddWP4=",
      "lastResultsHash": "VMIWdcTC6ZLJ1gW/VGyZ4yv/X2nis75e2PWnT+fmFoo=",
      "evidenceHash": "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=",
      "proposerAddress": "2MqI5T0aGLK0h3fNWAcQEKLplio="
    },
    "data": {
      "txsList": [
        "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",
       ...,
      ]
    },
    "evidence": {
      "evidenceList": []
    },
    "lastCommit": {
      "height": 488305,
      "round": 0,
      "blockId": {
        "hash": "s65ZLJIfoZau9ETSMyqYWTjTCsgB8zFgOMuwOUHhKkU=",
        "partSetHeader": {
          "total": 1,
          "hash": "4w05KvzYXCVH84P2uZ6jXduvwo+r/Bc+xhh/454T/Gs="
        }
      },
      "signaturesList": [
        {
          "blockIdFlag": 2,
          "validatorAddress": "Zdyy3QL8E8XZYhDrA8fAUD4m2Jc=",
          "timestamp": {
            "seconds": 1625718430,
            "nanos": 770011739
          },
          "signature": "mOOkCLg3uHBOUauypHAnWnBmoVlTXYrPE/i/AsAMOY4ptpHWdwXD4ZtC8XwOZJ5X1zG3yU3usk2gdvwrw2vbFA=="
        },
        {
          "blockIdFlag": 2,
          "validatorAddress": "xLnySmLJL6Qq4ebq+oPMs+KEerU=",
          "timestamp": {
            "seconds": 1625718430,
            "nanos": 732447931
          },
          "signature": "Atb6fJN5e2gLThE5gPl+9r9wVdmNhYlyTWXYsgwgs8wb4shgRIdGIMNg4hla/0udzStcvOEy7cO4npYUogGruA=="
        },
        {
          "blockIdFlag": 2,
          "validatorAddress": "D3OpjoewGqrIf2g+qADd6sKpM24=",
          "timestamp": {
            "seconds": 1625718430,
            "nanos": 825672211
          },
          "signature": "vMp3Q8xo9xLEs+PqyyN+t+rgIHzt4jMTQ0jOpFu1ISFbLBy0VDhIgb2QGaiCR1uyFPVgVVWzJ/hW7NqoTJR7Ug=="
        },
        ...,
      ]
    }
  }
}
```

---

## `getAccount(address)`

Get BandChain's account information

#### Parameter

- **address** `string` - A bech32-encoded account address

#### Return

- [`BaseAccount`] - An object containing account information

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";
const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

(async () => {
  console.log(
    JSON.stringify(
      await client.getAccount("band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f")
    )
  );
})();
```

#### Result

```json=
{
  "address": "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f",
  "pubKey": {
    "typeUrl": "/cosmos.crypto.secp256k1.PubKey",
    "value": "CiEDC6eHN+gwDqDhWZFUPuEZwhTHhUgmtLnGTjj/r9cy22M="
  },
  "accountNumber": 11,
  "sequence": 939
}
```

---

## `getDataSource(id)`

Get data source metadata by given ID

#### Parameter

- **id** `number` - Data source ID

#### Return

- [`DataSource`] - An object containing data source metadata

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

const id = 1;

(async () => {
  console.log(JSON.stringify(await client.getDataSource(id)));
})();
```

#### Result

```json
{
  "owner": "band1jfdmjkxs3hvddsf4ef2wmsmte3s5llqhxqgcfe",
  "name": "DS1",
  "description": "TBD",
  "filename": "32ee6262d4a615f2c3ca0589c1c1af79212f24823453cb3f4cfff85b8d338045",
  "treasury": "band1jfdmjkxs3hvddsf4ef2wmsmte3s5llqhxqgcfe",
  "feeList": []
}
```

---

## `getOracleScript(id)`

Get oracle script metadata by given ID

#### Parameter

- **id** `number` - Oracle Script ID

#### Return

- [`OracleScript`] - Oracle Script metadata

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

const id = 1;

(async () => {
  console.log(JSON.stringify(await client.getOracleScript(id)));
})();
```

#### Result

```json
{
  "owner": "band1jfdmjkxs3hvddsf4ef2wmsmte3s5llqhxqgcfe",
  "name": "OS1",
  "description": "TBD",
  "filename": "f86b37dbe62c3b8c86ae28523bf09e9963a6b2951dd1a5be79f29f66d8236abf",
  "schema": "{gas_option:string}/{gweix10:u64}",
  "sourceCodeUrl": ""
}
```

---

## `getRequestByID(id)`

Get an oracle request by given request ID

#### Parameter

- **id** `number` - Request ID

#### Return

- [`Request`] - Information of the oracle request

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

const id = 143959;

(async () => {
  console.log(JSON.stringify(await client.getRequestById(id)));
})();
```

#### Result

```json=
{
  "request": {
    "oracleScriptId": 37,
    "calldata": "AAAADwAAAANVTkkAAAAFU1VTSEkAAAAEVVNEQwAAAARVU0RUAAAAA0RBSQAAAANZRkkAAAADU05YAAAABFNVU0QAAAADTUtSAAAAA0NSVgAAAAZSRU5CVEMAAAAEV0JUQwAAAARMSU5LAAAABENPTVAAAAAEQkFORAAAAAA7msoA",
    "requestedValidatorsList": [
      "bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u",
      "bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz",
      "bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy",
      "bandvaloper1lm2puy995yt8dh53cnazk3ge3m27t7cay4ndaq",
      "bandvaloper1v0u0tsptnkcdrju4qlj0hswqhnqcn47d20prfy",
      "bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj"
    ],
    "minCount": 3,
    "requestHeight": 488761,
    "requestTime": 1625719798,
    "clientId": "alpha",
    "rawRequestsList": [
      {
        "externalId": 6,
        "dataSourceId": 61,
        "calldata": "REFJIExJTksgQ09NUA=="
      },
      {
        "externalId": 3,
        "dataSourceId": 62,
        "calldata": "VU5JIFNVU0hJIFVTREMgVVNEVCBEQUkgWUZJIFNOWCBTVVNEIE1LUiBDUlYgUkVOQlRDIFdCVEMgTElOSyBDT01QIEJBTkQ="
      },
      {
        "externalId": 0,
        "dataSourceId": 57,
        "calldata": "VVNEVCBCQU5E"
      },
      ...,
    ],
    "executeGas": 1000000
  },
  "reportsList": [
    {
      "validator": "bandvaloper1p46uhvdk8vr829v747v85hst3mur2dzlhfemmz",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 2,
          "exitCode": 1,
          "data": "NDI5IENsaWVudCBFcnJvcjogVG9vIE1hbnkgUmVxdWVzdHMgZm9yIHVybDogaHR0cHM6Ly9hcGkuY29pbmdlY2tvLmNvbS9hcGkvdjMvY29pbnMvbGlzdAo="
        },
        {
          "externalId": 0,
          "exitCode": 0,
          "data": "MS4wMDExODUsNi40NjU4MzcK"
        },
        {
          "externalId": 1,
          "exitCode": 0,
          "data": "MjEuMDksOC4zNjksMC45OTk4LDEsMS4wMDEsMzQzMTYuNzMsMTAuMjEsMS4wMDUsMjcxOS41NCwxLjg2OCwzMzIxOS42NSwxOS4wNSw0MjMuOSw2LjQwMgo="
        },
        ...,
      ]
    },
    {
      "validator": "bandvaloper1274qgg28xkz6f3upx05ftr9zepgmtfgts392dy",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 0,
          "exitCode": 0,
          "data": "MS4wMDExODUsNi40NjU4MzcK"
        },
        {
          "externalId": 6,
          "exitCode": 0,
          "data": "MS4wMDA4NTMsMTkuMTY0NjIsNDI2LjYK"
        },
        {
          "externalId": 1,
          "exitCode": 0,
          "data": "MjEuMDksOC4zNjksMC45OTk4LDEsMS4wMDEsMzQzMTYuNzMsMTAuMjEsMS4wMDUsMjcxOS41NCwxLjg2OCwzMzIxOS42NSwxOS4wNSw0MjMuOSw2LjQwMgo="
        },
        ...,
      ]
    },
    {
      "validator": "bandvaloper1v0u0tsptnkcdrju4qlj0hswqhnqcn47d20prfy",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 0,
          "exitCode": 0,
          "data": "MS4wMDExODUsNi40NjU4MzcK"
        },
        {
          "externalId": 1,
          "exitCode": 0,
          "data": "MjEuMDksOC4zNjksMC45OTk4LDEsMS4wMDEsMzQzMTYuNzMsMTAuMjEsMS4wMDUsMjcxOS41NCwxLjg2OCwzMzIxOS42NSwxOS4wNSw0MjMuOSw2LjQwMgo="
        },
        {
          "externalId": 3,
          "exitCode": 0,
          "data": "MjEuMjUyMSw4LjQ0MjY4OSwxLjAwMDkxMSwxLjAwMTA0MSwxLjAwMDgzLDM0NTQ4LjUxOTEsMTAuMTMwNSwxLjAwNjU2NywyNzMxLjA3MTgsMS44ODk5MTMsMzMyMDMuMzkwMSwzMzI3Mi40ODM5LDE5LjIwMjEsNDI2LjU4Nyw2LjQ1MDA0OAo="
        },
        ...,
      ]
    },
  ],
  "result": {
    "clientId": "alpha",
    "oracleScriptId": 37,
    "calldata": "AAAADwAAAANVTkkAAAAFU1VTSEkAAAAEVVNEQwAAAARVU0RUAAAAA0RBSQAAAANZRkkAAAADU05YAAAABFNVU0QAAAADTUtSAAAAA0NSVgAAAAZSRU5CVEMAAAAEV0JUQwAAAARMSU5LAAAABENPTVAAAAAEQkFORAAAAAA7msoA",
    "askCount": 6,
    "minCount": 3,
    "requestId": 143959,
    "ansCount": 6,
    "requestTime": 1625719798,
    "resolveTime": 1625719807,
    "resolveStatus": 1,
    "result": "AAAADwAAAATt3DGgAAAAAfZv9mAAAAAAO5oGsAAAAAA7msoAAAAAADumO7AAAB9s/0p6AAAAAAJckF8gAAAAADvnFT8AAAJ8Y5ZhgAAAAABwpcioAAAeNwdVEQ8AAB45MfNWAAAAAAR1h8AgAAAAYw1OVkAAAAABgFSsAA=="
  }
}
```

---

## `getReporters(validator)`

Get a list of reporter account addresses associated with given validator

#### Parameter

- **validator** `string` - a bech32-encoded validator address

#### Return

- `string[]` - a list of reporter's bech32-encoded account address

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

(async () => {
  console.log(
    JSON.stringify(
      await client.getReporters("bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u")
    )
  );
})();
```

#### Result

```json
[
  "band17n5rmujk78nkgss7tjecg4nfzn6geg4cvaqt5h",
  "band1wc6r20m8qg7p3lze55kzen5uwssdvwr7wl5w4q",
  "band1wm0lw8wzt094xdyxx4ukx432q9vcwdl9zmwa4x",
  "band10ptt5622ezszsvrcum07ehng3merea9x5jetv2",
  "band10lyra24wxsme03pe47du6xfurtsqzs99mn5r94",
  "band1ek7hfydf3xgz3k6nnsy2zrg0xxuzkvhzrykrn5",
]
```

---

## `getLatestRequest(oid, calldata, minCount, askCount)`

Search for latest request that match given oracle script ID, calldata, min count, and ask count.

#### Parameter

- **oid** `number` - Oracle script ID
- **calldata** `string` - OBI-encoded calldata of the oracle request in hex format
- **minCount** `number` - The minimum number of validators necessary for the request to proceed to the execution phase
- **askCount** `number` - The number of validators that are requested to respond to this request

#### Return

- [`QueryRequestResponse`] - An object containing oracle request information, reports of the request, and final result

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

const oid = 37;
const calldata = "000000060000000342544300000003455448000000034d495200000003414e4300000004444f4745000000044c554e41000000003b9aca00";
const minCount = 3;
const askCount = 6;

(async () => {
  console.log(
    JSON.stringify(
      await client.getLatestRequest(oid, calldata, minCount, askCount)
    )
  );
})();
```

#### Result

```json=
{
  "request": {
    "oracleScriptId": 37,
    "calldata": "AAAABgAAAANCVEMAAAADRVRIAAAAA01JUgAAAANBTkMAAAAERE9HRQAAAARMVU5BAAAAADuaygA=",
    "requestedValidatorsList": [
      "bandvaloper1lm2puy995yt8dh53cnazk3ge3m27t7cay4ndaq",
      "bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u",
      "bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj",
      ...,
    ],
    "minCount": 3,
    "requestHeight": 493003,
    "requestTime": 1625732656,
    "clientId": "mirror-protocol",
    "rawRequestsList": [
      {
        "externalId": 6,
        "dataSourceId": 61,
        "calldata": "QlRDIEVUSA=="
      },
      {
        "externalId": 0,
        "dataSourceId": 57,
        "calldata": "QlRDIEVUSA=="
      },
      {
        "externalId": 3,
        "dataSourceId": 62,
        "calldata": "QlRDIEVUSCBNSVIgQU5DIERPR0UgTFVOQQ=="
      },
      ...,
    ],
    "executeGas": 1000000
  },
  "reportsList": [
    {
      "validator": "bandvaloper1t9vedyzsxewe6lhpf9vm47em2hly23xm6uqtec",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 6,
          "exitCode": 0,
          "data": "MzI0NDQuMzMsMjE3Mi4yNAo="
        },
        {
          "externalId": 2,
          "exitCode": 0,
          "data": "MzI1MzQsMjE4MS42MSwzLjc2LDIuMTcsMC4yMTMzMDUsNi41OAo="
        },
        {
          "externalId": 1,
          "exitCode": 0,
          "data": "MzI0NDAuMDIsMjE3Ni44MywyLjE2MSwwLjIxMjMsNi41NzEK"
        },
        ...,
      ]
    },
    {
      "validator": "bandvaloper1a570h9e3rtvfhm030ta5hvel7e7e4lh4pgv8wj",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 6,
          "exitCode": 0,
          "data": "MzI0NDQuMzQsMjE3Mi4yNAo="
        },
        {
          "externalId": 2,
          "exitCode": 0,
          "data": "MzI1MzIsMjE4MS42MywzLjc2LDIuMTcsMC4yMTMzNjcsNi41OAo="
        },
        {
          "externalId": 3,
          "exitCode": 0,
          "data": "MzI0NDQuMTA3NywyMTc1Ljk3MTcsMy43NDUxMTUsMi4xNjA5MTQsMC4yMTI1OTk4Miw2LjU5OTAxOAo="
        },
        ...,
      ]
    },
    {
      "validator": "bandvaloper1l2hchtyawk9tk43zzjrzr2lcd0zyxngcjdsshe",
      "inBeforeResolve": true,
      "rawReportsList": [
        {
          "externalId": 2,
          "exitCode": 0,
          "data": "MzI1MzIsMjE4MS42MywzLjc2LDIuMTcsMC4yMTMzNjcsNi41OAo="
        },
        {
          "externalId": 0,
          "exitCode": 0,
          "data": "MzI0NjYuNTg0OCwyMTYzLjA2NjYK"
        },
        {
          "externalId": 1,
          "exitCode": 0,
          "data": "MzI0NDAuMDIsMjE3Ni44MywyLjE2MSwwLjIxMjMsNi41NzEK"
        },
        ...,
      ]
    },
    ...,
  ],
  "result": {
    "clientId": "mirror-protocol",
    "oracleScriptId": 37,
    "calldata": "AAAABgAAAANCVEMAAAADRVRIAAAAA01JUgAAAANBTkMAAAAERE9HRQAAAARMVU5BAAAAADuaygA=",
    "askCount": 6,
    "minCount": 3,
    "requestId": 149702,
    "ansCount": 3,
    "requestTime": 1625732656,
    "resolveTime": 1625732662,
    "resolveStatus": 1,
    "result": "AAAABgAAHYGBsQoQAAAB+mFMa5AAAAAA3znreAAAAACAzj5AAAAAAAyncOAAAAABh6mAwA=="
  }
}
```

---

## `sendTxBlockMode(txBytes)`

Send a transaction using block mode, that is, send and wait until the transaction has been committed to a block.

#### Parameter

- **txBytes** `Uint8Array | string` - an byte array of serialized signed transaction

#### Return

- [`TxResponse`] - An object of transaction response

#### Example

```javascript=
import { Client, Wallet, Transaction, Message, Coin } from "@bandprotocol/bandchain.js";

const { PrivateKey } = Wallet;
const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

// Step 2.1 import private key based on given mnemonic string
const privkey = PrivateKey.fromMnemonic(
  "subject economy equal whisper turn boil guard giraffe stick retreat wealth card only buddy joy leave genuine resemble submit ghost top polar adjust avoid"
);
// Step 2.2 prepare public key and its address
const pubkey = privkey.toPubkey();
const sender = pubkey.toAddress().toAccBech32();

const sendCoin = async () => {
  // Step 3.1 constructs MsgSend message
  const { MsgSend } = Message

  // Here we use different message type, which is MsgSend
  const receiver = "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f"
  const sendAmount = new Coin()
  sendAmount.setDenom("uband")
  sendAmount.setAmount("10")
  const msg = new MsgSend(
    sender,
    receiver,
    [sendAmount],
  )
  // Step 3.2 constructs a transaction
  const account = await client.getAccount(sender)
  const chainId = "band-laozi-testnet2"
  const tx = new Transaction()
    .withMessages(msg.toAny())
    .withAccountNum(account.accountNumber)
    .withSequence(account.sequence)
    .withChainId(chainId)
    .withGas(1500000)
  
  // Step 4 sign the transaction
  const txSignData = tx.getSignDoc(pubkey)
  const signature = privkey.sign(txSignData)
  const signedTx = tx.getTxData(signature, pubkey)
  

  // Step 5 send the transaction
  const response = await client.sendTxBlockMode(signedTx)
  console.log(JSON.stringify(response))
}

(async () => {
  await sendCoin();
})();
```

#### Result

```json=
{
  "height": 493527,
  "txhash": "F76593C2165A42E39464FEAD998AE80970655D82B18085FD65917ACC0979279D",
  "codespace": "",
  "code": 0,
  "data": "0A060A0473656E64",
  "rawLog": "[{\"events\":[{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"send\"},{\"key\":\"sender\",\"value\":\"band168ukdplr7nrljaleef8ehpyvfhe4n78hz0shsy\"},{\"key\":\"module\",\"value\":\"bank\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f\"},{\"key\":\"sender\",\"value\":\"band168ukdplr7nrljaleef8ehpyvfhe4n78hz0shsy\"},{\"key\":\"amount\",\"value\":\"10uband\"}]}]}]",
  "logsList": [
    {
      "msgIndex": 0,
      "log": "",
      "eventsList": [
        {
          "type": "message",
          "attributesList": [
            { "key": "action", "value": "send" },
            { "key": "sender", "value": "band168ukdplr7nrljaleef8ehpyvfhe4n78hz0shsy" },
            { "key": "module", "value": "bank" }
          ]
        },
        {
          "type": "transfer",
          "attributesList": [
            { "key": "recipient", "value": "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f" },
            { "key": "sender", "value": "band168ukdplr7nrljaleef8ehpyvfhe4n78hz0shsy" },
            { "key": "amount", "value": "10uband" }
          ]
        }
      ]
    }
  ],
  "info": "",
  "gasWanted": 1500000,
  "gasUsed": 49013,
  "timestamp": ""
}
```

---

## `sendTxSyncMode(txBytes)`

Send a transaction in sync mode, that is, send and wait until transaction has passed CheckTx phase.

#### Parameter

- **txBytes** `Uint8Array` - a byte array of serialized signed transaction

#### Return

- [`TxResponse`] - An object of transaction response

#### Example

```javascript=
import { Client, Wallet, Transaction, Message, Coin } from "@bandprotocol/bandchain.js";

const { PrivateKey } = Wallet;
const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

// Step 2.1 import private key based on given mnemonic string
const privkey = PrivateKey.fromMnemonic(
  "subject economy equal whisper turn boil guard giraffe stick retreat wealth card only buddy joy leave genuine resemble submit ghost top polar adjust avoid"
);
// Step 2.2 prepare public key and its address
const pubkey = privkey.toPubkey();
const sender = pubkey.toAddress().toAccBech32();

const sendCoin = async () => {
  // Step 3.1 constructs MsgSend message
  const { MsgSend } = Message

  // Here we use different message type, which is MsgSend
  const receiver = "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f"
  const sendAmount = new Coin()
  sendAmount.setDenom("uband")
  sendAmount.setAmount("10")
  const msg = new MsgSend(
    sender,
    receiver,
    [sendAmount],
  )
  // Step 3.2 constructs a transaction
  const account = await client.getAccount(sender)
  const chainId = "band-laozi-testnet2"
  const tx = new Transaction()
    .withMessages(msg.toAny())
    .withAccountNum(account.accountNumber)
    .withSequence(account.sequence)
    .withChainId(chainId)
    .withGas(1500000)
  
  // Step 4 sign the transaction
  const txSignData = tx.getSignDoc(pubkey)
  const signature = privkey.sign(txSignData)
  const signedTx = tx.getTxData(signature, pubkey)
  

  // Step 5 send the transaction
  const response = await client.sendTxSyncMode(signedTx)
  console.log(JSON.stringify(response))
}

(async () => {
  await sendCoin();
})();
```

#### Result

```json
{
  "height": 0,
  "txhash": "48620C4242AFB1F18F0FA1C72ADE42C26FDCC804CB20E2BDBAE8B0097C5900B6",
  "codespace": "",
  "code": 0,
  "data": "",
  "rawLog": "[]",
  "logsList": [],
  "info": "",
  "gasWanted": 0,
  "gasUsed": 0,
  "timestamp": ""
}
```

---

## `sendTxAsyncMode(data)`

Send a transaction in async mode, that is, send and returned immediantly without waiting for the transaction processes.

#### Parameter

- **txBytes** `Uint8Array` - a byte array of serialized signed transaction

#### Return

- [`TxResponse`] - An object of transaction response

#### Example

```javascript=
import { Client, Wallet, Transaction, Message, Coin } from "@bandprotocol/bandchain.js";

const { PrivateKey } = Wallet;
const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

// Step 2.1 import private key based on given mnemonic string
const privkey = PrivateKey.fromMnemonic(
  "subject economy equal whisper turn boil guard giraffe stick retreat wealth card only buddy joy leave genuine resemble submit ghost top polar adjust avoid"
);
// Step 2.2 prepare public key and its address
const pubkey = privkey.toPubkey();
const sender = pubkey.toAddress().toAccBech32();

const sendCoin = async () => {
  // Step 3.1 constructs MsgSend message
  const { MsgSend } = Message

  // Here we use different message type, which is MsgSend
  const receiver = "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f"
  const sendAmount = new Coin()
  sendAmount.setDenom("uband")
  sendAmount.setAmount("10")
  const msg = new MsgSend(
    sender,
    receiver,
    [sendAmount],
  )
  // Step 3.2 constructs a transaction
  const account = await client.getAccount(sender)
  const chainId = "band-laozi-testnet2"
  const tx = new Transaction()
    .withMessages(msg.toAny())
    .withAccountNum(account.accountNumber)
    .withSequence(account.sequence)
    .withChainId(chainId)
    .withGas(1500000)
  
  // Step 4 sign the transaction
  const txSignData = tx.getSignDoc(pubkey)
  const signature = privkey.sign(txSignData)
  const signedTx = tx.getTxData(signature, pubkey)
  

  // Step 5 send the transaction
  const response = await client.sendTxAsyncMode(signedTx)
  console.log(JSON.stringify(response))
}

(async () => {
  await sendCoin();
})();
```

#### Result

```json=
{
  "height": 0,
  "txhash": "8A3573AC59BC6CC1A7ECF18A2E1FC50E8AE73E69A68351496872F08186D6158F",
  "codespace": "",
  "code": 0,
  "data": "",
  "rawLog": "",
  "logsList": [],
  "info": "",
  "gasWanted": 0,
  "gasUsed": 0,
  "timestamp": ""
}
```

---

## `getReferenceData(pairs, minCount, askCount)`

Get current prices from standard price references oracle script based on given symbol pairs, min count, and ask count.

#### Parameter

- **pairs** `string[]` - a list of symbol pairs e.g. BTC/USD, ETH/BTC, etc.
- **minCount** `number` - The minimum number of validators necessary for the request to proceed to the execution phase
- **askCount** `number` - The number of validators that are requested to respond to this request

#### Return

- [`ReferenceData[]`] - A list of prices for given pairs

#### Example

```javascript=
import { Client } from "@bandprotocol/bandchain.js";

const client = new Client("http://rpc-laozi-testnet2.bandchain.org:8080");

(async () => {
  console.log(
    JSON.stringify(
      await client.getReferenceData(["BTC/USD", "ETH/BTC"], 3, 6)
    )
  );
})();
```

#### Result

```json=
[
  {
    "pair": "BTC/USD",
    "rate": 32557.06795,
    "updatedAt": {
      "base": 1625736254,
      "quote": 1625736266
    },
    "requestId": {
      "base": 151316,
      "quote": 0
    }
  },
  {
    "pair": "ETH/BTC",
    "rate": 0.06693865225661391,
    "updatedAt": {
      "base": 1625736254,
      "quote": 1625736254
    },
    "requestId": {
      "base": 151316,
      "quote": 151316
    }
  }
]
```

[`referencedata`]: TODO:-add-link 
[`txresponse`]: TODO:-add-link 
[`queryrequestresponse`]: TODO:-add-link
[`request`]: TODO:-add-link
[`oraclescript`]: TODO:-add-link
[`datasource`]: TODO:-add-link
[`baseaccount`]: TODO:-add-link
[`block`]: TODO:-add-link