Client Module
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.
Note: The <GRPC_WEB> can be found in API Endpoints
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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(await client.getChainId())
})()
Result
band-laozi-testnet6
getLatestBlock
Get BandChain's latest block detail
Return
Block- BandChain's latest block
Example
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(await client.getLatestBlock())
})()
Result
{
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(
JSON.stringify(await client.getAccount('band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f'))
)
})()
Result
{
"address": "band1p46uhvdk8vr829v747v85hst3mur2dzlmlac7f",
"accountNumber": 242,
"sequence": 0
}
getAllBalances(address)
Returns all the account balances for the given account address.
Parameter
- address
string- A bech32-encoded account address
Return
Coin[]- A list of Coin that the account have
Example
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(
JSON.stringify(await client.getAllBalances('band1mrdmxkhtr3rgfzfgrkxy5pvjtvnm5qq0my5m0x'))
)
})()
Result
[
{
"amount": "10000000",
"denom": "uband"
}
]
getDataSource(id)
Get data source metadata by given ID
Parameter
- id
number- Data source ID
Return
DataSource- An object containing data source metadata
Example
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
const id = 1
;(async () => {
console.log(JSON.stringify(await client.getDataSource(id)))
})()
Result
{
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
const id = 1
;(async () => {
console.log(JSON.stringify(await client.getOracleScript(id)))
})()
Result
{
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
const id = 143959
;(async () => {
console.log(JSON.stringify(await client.getRequestById(id)))
})()
Result
{
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(
JSON.stringify(await client.getReporters('bandvaloper17n5rmujk78nkgss7tjecg4nfzn6geg4cqtyg3u'))
)
})()
Result
[
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
const oid = 37
const calldata =
'000000060000000342544300000003455448000000034d495200000003414e4300000004444f4745000000044c554e41000000003b9aca00'
const minCount = 3
const askCount = 4
;(async () => {
console.log(JSON.stringify(await client.getLatestRequest(oid, calldata, minCount, askCount)))
})()
Result
{
"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
import { Client, Wallet, Transaction, Message, Coin, Fee } from '@bandprotocol/bandchain.js'
const { PrivateKey } = Wallet
const client = new Client('<GRPC_WEB>')
// 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-testnet6'
let feeCoin = new Coin()
feeCoin.setDenom('uband')
feeCoin.setAmount('1000')
const fee = new Fee()
fee.setAmountList([feeCoin])
fee.setGasLimit(1000000)
const tx = new Transaction()
.withMessages(msg.toAny())
.withAccountNum(account.accountNumber)
.withSequence(account.sequence)
.withChainId(chainId)
.withFee(fee)
// 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
{
"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
import { Client, Wallet, Transaction, Message, Coin, Fee } from '@bandprotocol/bandchain.js'
const { PrivateKey } = Wallet
const client = new Client('<GRPC_WEB>')
// 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-testnet6'
let feeCoin = new Coin()
feeCoin.setDenom('uband')
feeCoin.setAmount('1000')
const fee = new Fee()
fee.setAmountList([feeCoin])
fee.setGasLimit(1000000)
const tx = new Transaction()
.withMessages(msg.toAny())
.withAccountNum(account.accountNumber)
.withSequence(account.sequence)
.withChainId(chainId)
.withFee(fee)
// 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
{
"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
import { Client, Wallet, Transaction, Message, Coin, Fee } from '@bandprotocol/bandchain.js'
const { PrivateKey } = Wallet
const client = new Client('<GRPC_WEB>')
// 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-testnet6'
let feeCoin = new Coin()
feeCoin.setDenom('uband')
feeCoin.setAmount('1000')
const fee = new Fee()
fee.setAmountList([feeCoin])
fee.setGasLimit(1000000)
const tx = new Transaction()
.withMessages(msg.toAny())
.withAccountNum(account.accountNumber)
.withSequence(account.sequence)
.withChainId(chainId)
.withFee(fee)
// 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
{
"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
import { Client } from '@bandprotocol/bandchain.js'
const client = new Client('<GRPC_WEB>')
;(async () => {
console.log(JSON.stringify(await client.getReferenceData(['BTC/USD', 'ETH/BTC'], 3, 4)))
})()
Result
[
{
"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
}
}
]