UNPKG

sensible-sdk

Version:

Sensible-SDK

387 lines (386 loc) 15 kB
"use strict"; 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 }); exports.Sensible = void 0; const error_1 = require("../common/error"); const net_1 = require("../net"); const index_1 = require("./index"); class Sensible { constructor(apiTarget, apiNet, serverBase) { if (apiTarget == index_1.API_TARGET.SENSIBLE) { if (apiNet == index_1.API_NET.MAIN) { this.serverBase = "https://api-v2.sensiblequery.com"; } else { this.serverBase = "https://api-v2.sensiblequery.com/test"; } } else if (apiTarget == index_1.API_TARGET.SHOW) { if (apiNet == index_1.API_NET.MAIN) { this.serverBase = "https://sensiblequery.show.sv"; } else { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, "show only support mainnet"); } } if (serverBase) { this.serverBase = serverBase; } } authorize(options) { const { authorization } = options; if (authorization) { if (authorization.indexOf("Bearer") != 0) { this.authorization = `Bearer ${authorization}`; } else { this.authorization = authorization; } } else { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, "only support authorization"); } } _getHeaders() { let headers = {}; if (this.authorization) { headers = { authorization: this.authorization }; } return headers; } /** * @param {string} address */ getUnspents(address) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/address/${address}/utxo?size=100`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } let ret = data.map((v) => ({ txId: v.txid, outputIndex: v.vout, satoshis: v.satoshi, address: address, })); return ret; }); } /** * @param {string} hex */ broadcast(txHex) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/pushtx`; let _res = yield net_1.Net.httpPost(url, { txHex, }, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } return data; }); } /** * @param {string} txid */ getRawTxData(txid) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/rawtx/${txid}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) { console.log("getRawfailed", url); } return data; }); } /** * 通过FT合约CodeHash+溯源genesis获取某地址的utxo列表 */ getFungibleTokenUnspents(codehash, genesis, address, size = 20) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/ft/utxo/${codehash}/${genesis}/${address}?size=${size}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return []; let ret = data.map((v) => ({ txId: v.txid, outputIndex: v.vout, tokenAddress: address, tokenAmount: v.tokenAmount, })); return ret; }); } /** * 查询某人持有的某FT的余额 */ getFungibleTokenBalance(codehash, genesis, address) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/ft/balance/${codehash}/${genesis}/${address}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } let ret = { balance: data.balance.toString(), pendingBalance: data.pendingBalance.toString(), utxoCount: data.utxoCount, decimal: data.decimal, }; return ret; }); } /** * 通过NFT合约CodeHash+溯源genesis获取某地址的utxo列表 */ getNonFungibleTokenUnspents(codehash, genesis, address, cursor = 0, size = 100) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/utxo/${codehash}/${genesis}/${address}?cursor=${cursor}&size=${size}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return []; let ret = data.map((v) => ({ txId: v.txid, outputIndex: v.vout, tokenAddress: address, tokenIndex: v.tokenIndex, metaTxId: v.metaTxId, metaOutputIndex: v.metaOutputIndex, })); return ret; }); } /** * 查询某人持有的某FT的UTXO */ getNonFungibleTokenUnspentDetail(codehash, genesis, tokenIndex) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/utxo-detail/${codehash}/${genesis}/${tokenIndex}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return null; let ret = [data].map((v) => ({ txId: v.txid, outputIndex: v.vout, tokenAddress: v.address, tokenIndex: v.tokenIndex, metaTxId: v.metaTxId, metaOutputIndex: v.metaOutputIndex, }))[0]; return ret; }); } /** * 查询某人持有的FT Token列表。获得每个token的余额 */ getFungibleTokenSummary(address) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/ft/summary/${address}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } let ret = []; data.forEach((v) => { ret.push({ codehash: v.codehash, genesis: v.genesis, sensibleId: v.sensibleId, pendingBalance: v.pendingBalance.toString(), balance: v.balance.toString(), symbol: v.symbol, decimal: v.decimal, }); }); return ret; }); } /** * 查询某人持有的所有NFT Token列表。获得持有的nft数量计数 * @param {String} address * @returns */ getNonFungibleTokenSummary(address) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/summary/${address}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } let ret = []; if (data) { data.forEach((v) => { ret.push({ codehash: v.codehash, genesis: v.genesis, sensibleId: v.sensibleId, count: v.count, pendingCount: v.pendingCount, metaTxId: v.metaTxId, metaOutputIndex: v.metaOutputIndex, supply: v.supply, }); }); } return ret; }); } getBalance(address) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/address/${address}/balance`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } return { balance: data.satoshi, pendingBalance: data.pendingSatoshi, }; }); } getNftSellUtxo(codehash, genesis, tokenIndex) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/sell/utxo-detail/${codehash}/${genesis}/${tokenIndex}?isReadyOnly=true`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return null; let ret = data .filter((v) => v.isReady == true) .map((v) => ({ codehash, genesis, tokenIndex, txId: v.txid, outputIndex: v.vout, sellerAddress: v.address, satoshisPrice: v.price, }))[0]; return ret; }); } getNftSellList(codehash, genesis, cursor = 0, size = 20) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/sell/utxo/${codehash}/${genesis}?cursor=${cursor}&size=${size}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return null; let ret = data.map((v) => ({ codehash, genesis, tokenIndex: v.tokenIndex, txId: v.txid, outputIndex: v.vout, sellerAddress: v.address, satoshisPrice: v.price, })); return ret; }); } getNftSellListByAddress(address, cursor = 0, size = 20) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/nft/sell/utxo-by-address/${address}?cursor=${cursor}&size=${size}`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { throw new error_1.CodeError(error_1.ErrCode.EC_SENSIBLE_API_ERROR, `request api failed. [url]:${url} [msg]:${msg}`); } if (!data) return null; let ret = data.map((v) => ({ codehash: v.codehash, genesis: v.genesis, tokenIndex: v.tokenIndex, txId: v.txid, outputIndex: v.vout, sellerAddress: v.address, satoshisPrice: v.price, })); return ret; }); } getOutpointSpent(txId, index) { return __awaiter(this, void 0, void 0, function* () { let url = `${this.serverBase}/tx/${txId}/out/${index}/spent`; let _res = yield net_1.Net.httpGet(url, {}, { headers: this._getHeaders(), }); const { code, data, msg } = _res; if (code != 0) { return null; } if (!data) return null; return { spentTxId: data.txid, spentInputIndex: data.idx, }; }); } } exports.Sensible = Sensible;