@bandprotocol/bandchain.js
Version:
Library for interacting with BandChain in browser and Node.js environments
363 lines (362 loc) • 16.5 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const grpc_web_node_http_transport_1 = require("@improbable-eng/grpc-web-node-http-transport");
const error_1 = require("./error");
const query_pb_service_1 = require("../codegen/oracle/v1/query_pb_service");
const query_pb_service_2 = require("../codegen/cosmos/base/tendermint/v1beta1/query_pb_service");
const query_pb_service_3 = require("../codegen/cosmos/auth/v1beta1/query_pb_service");
const service_pb_service_1 = require("../codegen/cosmos/tx/v1beta1/service_pb_service");
const query_pb_service_4 = require("../codegen/cosmos/bank/v1beta1/query_pb_service");
const query_pb_1 = require("../codegen/oracle/v1/query_pb");
const query_pb_2 = require("../codegen/cosmos/base/tendermint/v1beta1/query_pb");
const query_pb_3 = require("../codegen/cosmos/auth/v1beta1/query_pb");
const service_pb_1 = require("../codegen/cosmos/tx/v1beta1/service_pb");
const service_pb_2 = require("../codegen/cosmos/tx/v1beta1/service_pb");
const auth_pb_1 = require("../codegen/cosmos/auth/v1beta1/auth_pb");
const query_pb_4 = require("../codegen/cosmos/bank/v1beta1/query_pb");
class Client {
constructor(grpcUrl) {
this.queryClient = new query_pb_service_1.QueryClient(grpcUrl, {
transport: (0, grpc_web_node_http_transport_1.NodeHttpTransport)(),
});
this.serviceClient = new query_pb_service_2.ServiceClient(grpcUrl, {
transport: (0, grpc_web_node_http_transport_1.NodeHttpTransport)(),
});
this.authQueryClient = new query_pb_service_3.QueryClient(grpcUrl, {
transport: (0, grpc_web_node_http_transport_1.NodeHttpTransport)(),
});
this.txServiceClient = new service_pb_service_1.ServiceClient(grpcUrl, {
transport: (0, grpc_web_node_http_transport_1.NodeHttpTransport)(),
});
this.queryAllBalances = new query_pb_service_4.QueryClient(grpcUrl, {
transport: (0, grpc_web_node_http_transport_1.NodeHttpTransport)(),
});
}
getDataSource(id) {
return __awaiter(this, void 0, void 0, function* () {
if (!Number.isInteger(id))
throw new error_1.NotIntegerError('id is not an integer');
const request = new query_pb_1.QueryDataSourceRequest();
request.setDataSourceId(id);
return new Promise((resolve, reject) => {
this.queryClient.dataSource(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasDataSource()) {
resolve(response.getDataSource().toObject());
return;
}
reject(new error_1.NotFoundError(`data source with ID ${id} does not exist`));
});
});
});
}
getOracleScript(id) {
return __awaiter(this, void 0, void 0, function* () {
if (!Number.isInteger(id))
throw new error_1.NotIntegerError('id is not an integer');
const request = new query_pb_1.QueryOracleScriptRequest();
request.setOracleScriptId(id);
return new Promise((resolve, reject) => {
this.queryClient.oracleScript(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasOracleScript()) {
resolve(response.getOracleScript().toObject());
return;
}
reject(new error_1.NotFoundError(`oracle script with ID ${id} does not exist`));
});
});
});
}
getRequestById(id) {
return __awaiter(this, void 0, void 0, function* () {
if (!Number.isInteger(id))
throw new error_1.NotIntegerError('id is not an integer');
const request = new query_pb_1.QueryRequestRequest();
request.setRequestId(id);
return new Promise((resolve, reject) => {
this.queryClient.request(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null) {
resolve(response.toObject());
}
});
});
});
}
getReporters(validator) {
return __awaiter(this, void 0, void 0, function* () {
const request = new query_pb_1.QueryReportersRequest();
request.setValidatorAddress(validator);
return new Promise((resolve, reject) => {
this.queryClient.reporters(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null) {
resolve(response.getReporterList());
}
});
});
});
}
getLatestBlock() {
return __awaiter(this, void 0, void 0, function* () {
const request = new query_pb_2.GetLatestBlockRequest();
return new Promise((resolve, reject) => {
this.serviceClient.getLatestBlock(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null) {
resolve(response.toObject());
}
});
});
});
}
getAccount(address) {
return __awaiter(this, void 0, void 0, function* () {
const request = new query_pb_3.QueryAccountRequest();
request.setAddress(address);
return new Promise((resolve, reject) => {
this.authQueryClient.account(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasAccount()) {
let accBaseAccount = response
.getAccount()
.unpack(auth_pb_1.BaseAccount.deserializeBinary, 'cosmos.auth.v1beta1.BaseAccount');
if (accBaseAccount !== null) {
resolve(accBaseAccount.toObject());
return;
}
reject(new error_1.ValueError(`only base account allowed, expected BaseAccount, got ${response
.getAccount()
.getTypeName()}`));
}
});
});
});
}
getRequestIdByTxHash(txHash) {
return __awaiter(this, void 0, void 0, function* () {
const request = new service_pb_1.GetTxRequest();
request.setHash(txHash);
return new Promise((resolve, reject) => {
this.txServiceClient.getTx(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response === null || !response.hasTxResponse()) {
reject(new error_1.NotFoundError('the given tx hash does not exists'));
}
let reqIdList = [];
response.toObject().txResponse.logsList.forEach((txLog) => {
txLog.eventsList.forEach((event) => {
if (event.type === 'report' || event.type === 'request') {
event.attributesList.forEach((attribute) => {
if (attribute.key === 'id') {
reqIdList.push(Number(attribute.value));
}
});
}
});
});
if (reqIdList.length === 0) {
reject(new error_1.NotFoundError('request ID is not found in given transaction hash'));
return;
}
resolve(reqIdList);
});
});
});
}
getChainId() {
return __awaiter(this, void 0, void 0, function* () {
const latestBlock = yield this.getLatestBlock();
return latestBlock.block.header.chainId;
});
}
sendTxSyncMode(txBytes) {
return __awaiter(this, void 0, void 0, function* () {
const request = new service_pb_2.BroadcastTxRequest();
request.setTxBytes(txBytes);
request.setMode(2);
return new Promise((resolve, reject) => {
this.txServiceClient.broadcastTx(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasTxResponse()) {
resolve(response.getTxResponse().toObject());
}
});
});
});
}
sendTxAsyncMode(txBytes) {
return __awaiter(this, void 0, void 0, function* () {
const request = new service_pb_2.BroadcastTxRequest();
request.setTxBytes(txBytes);
request.setMode(3);
return new Promise((resolve, reject) => {
this.txServiceClient.broadcastTx(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasTxResponse()) {
resolve(response.getTxResponse().toObject());
}
});
});
});
}
sendTxBlockMode(txBytes) {
return __awaiter(this, void 0, void 0, function* () {
const request = new service_pb_2.BroadcastTxRequest();
request.setTxBytes(txBytes);
request.setMode(1);
return new Promise((resolve, reject) => {
this.txServiceClient.broadcastTx(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasTxResponse()) {
resolve(response.getTxResponse().toObject());
}
});
});
});
}
getReferenceData(pairs, minCount, askCount) {
return __awaiter(this, void 0, void 0, function* () {
const request = new query_pb_1.QueryRequestPriceRequest();
let symbolSet = new Set();
pairs.forEach((pair) => {
let symbols = pair.split('/');
symbols.forEach((symbol) => {
if (symbol === 'USD')
return;
symbolSet.add(symbol);
});
});
request.setSymbolsList(Array.from(symbolSet));
request.setAskCount(askCount);
request.setMinCount(minCount);
return new Promise((resolve, reject) => {
this.queryClient.requestPrice(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
const finalResult = [];
const symbolMap = {};
symbolMap['USD'] = {
symbol: 'USD',
multiplier: 1000000000,
px: 1000000000,
requestId: 0,
resolveTime: Math.floor(Date.now() / 1000),
};
response.toObject().priceResultsList.forEach((priceResult) => {
symbolMap[priceResult.symbol] = priceResult;
});
pairs.forEach((pair) => {
let [baseSymbol, quoteSymbol] = pair.split('/');
finalResult.push({
pair,
rate: (Number(symbolMap[baseSymbol].px) *
Number(symbolMap[quoteSymbol].multiplier)) /
(Number(symbolMap[quoteSymbol].px) *
Number(symbolMap[baseSymbol].multiplier)),
updatedAt: {
base: Number(symbolMap[baseSymbol].resolveTime),
quote: Number(symbolMap[quoteSymbol].resolveTime),
},
requestId: {
base: Number(symbolMap[baseSymbol].requestId),
quote: Number(symbolMap[quoteSymbol].requestId),
},
});
});
resolve(finalResult);
});
});
});
}
getLatestRequest(oid, calldata, minCount, askCount) {
return __awaiter(this, void 0, void 0, function* () {
if (!Number.isInteger(oid))
throw new error_1.NotIntegerError('oid is not an integer');
if (!Number.isInteger(minCount))
throw new error_1.NotIntegerError('minCount is not an integer');
if (!Number.isInteger(askCount))
throw new error_1.NotIntegerError('askCount is not an integer');
const request = new query_pb_1.QueryRequestSearchRequest();
request.setOracleScriptId(oid);
request.setCalldata(calldata);
request.setAskCount(askCount);
request.setMinCount(minCount);
return new Promise((resolve, reject) => {
this.queryClient.requestSearch(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null && response.hasRequest()) {
resolve(response.getRequest().toObject());
return;
}
reject(new error_1.NotFoundError('request not found'));
});
});
});
}
getAllBalances(address) {
return __awaiter(this, void 0, void 0, function* () {
const request = new query_pb_4.QueryAllBalancesRequest();
request.setAddress(address);
return new Promise((resolve, reject) => {
this.queryAllBalances.allBalances(request, {}, (err, response) => {
if (err !== null) {
reject(err);
return;
}
if (response !== null) {
resolve(response.getBalancesList().map((coin) => coin.toObject()));
return;
}
reject(new error_1.NotFoundError(`Address ${address} does not exist`));
});
});
});
}
}
exports.default = Client;