2019-10-22 17:09:07 +08:00
|
|
|
const config = require('../../../mempool-config.json');
|
2020-02-17 20:39:20 +07:00
|
|
|
import { Transaction, Block, MempoolInfo } from '../../interfaces';
|
2019-12-06 21:59:43 +01:00
|
|
|
import * as request from 'request';
|
2019-10-22 17:09:07 +08:00
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
class ElectrsApi {
|
2019-10-22 17:09:07 +08:00
|
|
|
|
|
|
|
constructor() {
|
|
|
|
}
|
|
|
|
|
2020-02-17 20:39:20 +07:00
|
|
|
getMempoolInfo(): Promise<MempoolInfo> {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
request(config.ELECTRS_API_URL + '/mempool', { json: true, timeout: 10000 }, (err, res, response) => {
|
|
|
|
if (err) {
|
|
|
|
reject(err);
|
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
|
|
|
if (!response.count) {
|
|
|
|
reject('Empty data');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
resolve({
|
|
|
|
size: response.count,
|
|
|
|
bytes: response.vsize,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
getRawMempool(): Promise<Transaction['txid'][]> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
2020-02-16 22:15:07 +07:00
|
|
|
request(config.ELECTRS_API_URL + '/mempool/txids', { json: true, timeout: 10000, forever: true }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
2020-03-03 16:44:32 +07:00
|
|
|
if (response.constructor === Array) {
|
|
|
|
resolve(response);
|
|
|
|
} else {
|
|
|
|
reject('returned invalid data');
|
|
|
|
}
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-10-22 17:09:07 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
getRawTransaction(txId: string): Promise<Transaction> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
2020-02-16 22:15:07 +07:00
|
|
|
request(config.ELECTRS_API_URL + '/tx/' + txId, { json: true, timeout: 10000, forever: true }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
2020-03-03 16:44:32 +07:00
|
|
|
if (response.constructor === Object) {
|
|
|
|
resolve(response);
|
|
|
|
} else {
|
|
|
|
reject('returned invalid data');
|
|
|
|
}
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-10-22 17:09:07 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
getBlockHeightTip(): Promise<number> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
request(config.ELECTRS_API_URL + '/blocks/tip/height', { json: true, timeout: 10000 }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
|
|
|
resolve(response);
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-10-22 17:09:07 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-02-23 19:16:50 +07:00
|
|
|
getTxIdsForBlock(hash: string): Promise<string[]> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
2020-02-16 22:15:07 +07:00
|
|
|
request(config.ELECTRS_API_URL + '/block/' + hash + '/txids', { json: true, timeout: 10000 }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
2020-03-03 16:44:32 +07:00
|
|
|
if (response.constructor === Array) {
|
|
|
|
resolve(response);
|
|
|
|
} else {
|
|
|
|
reject('returned invalid data');
|
|
|
|
}
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-10-22 17:09:07 +08:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
getBlockHash(height: number): Promise<string> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
request(config.ELECTRS_API_URL + '/block-height/' + height, { json: true, timeout: 10000 }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
|
|
|
resolve(response);
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-10-22 17:09:07 +08:00
|
|
|
});
|
|
|
|
}
|
2019-11-06 15:35:02 +08:00
|
|
|
|
|
|
|
getBlocksFromHeight(height: number): Promise<string> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
request(config.ELECTRS_API_URL + '/blocks/' + height, { json: true, timeout: 10000 }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
|
|
|
} else {
|
|
|
|
resolve(response);
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-11-06 15:35:02 +08:00
|
|
|
});
|
|
|
|
}
|
2019-11-12 16:39:59 +08:00
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
getBlock(hash: string): Promise<Block> {
|
2019-12-09 19:14:54 +07:00
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
request(config.ELECTRS_API_URL + '/block/' + hash, { json: true, timeout: 10000 }, (err, res, response) => {
|
2019-12-06 21:59:43 +01:00
|
|
|
if (err) {
|
|
|
|
reject(err);
|
2019-12-09 19:14:54 +07:00
|
|
|
} else if (res.statusCode !== 200) {
|
|
|
|
reject(response);
|
2020-04-12 03:03:51 +07:00
|
|
|
} else {
|
|
|
|
if (response.constructor === Object) {
|
|
|
|
resolve(response);
|
|
|
|
} else {
|
|
|
|
reject('getBlock returned invalid data');
|
|
|
|
}
|
2019-12-06 21:59:43 +01:00
|
|
|
}
|
|
|
|
});
|
2019-11-12 16:39:59 +08:00
|
|
|
});
|
|
|
|
}
|
2019-10-22 17:09:07 +08:00
|
|
|
}
|
|
|
|
|
2020-02-16 22:15:07 +07:00
|
|
|
export default new ElectrsApi();
|