UNPKG

@btc-vision/bitcoin-rpc

Version:

The one and only fully typed Bitcoin RPC client for Node.js

143 lines (118 loc) 5.32 kB
import { Fetch, IFetchOptions } from 'rpc-request'; export type formatParam = { format?: 'json' | 'hex' | 'bin' }; export type BlockParams = formatParam & { hash: string }; export type BlockHeightParams = formatParam & { height: number }; export type Outpoint = { txid: string; n: number }; export type UtxosParams = formatParam & { checkmempool?: boolean; outpoints: Outpoint[] | Outpoint; }; export type HeaderParams = BlockParams & { count?: number }; export type TxParams = formatParam & { txid: string }; export type Auth = { user: string; pass: string }; export type RESTIniOptions = IFetchOptions & { auth?: Auth; port?: number; url: string }; export type AuthHeaders = HeadersInit & { Authorization: string }; export class RESTClient extends Fetch { /** * @param {RESTIniOptions} [opts] */ constructor(opts: RESTIniOptions) { if (!opts.url) { throw new Error('URL is required'); } const params: RESTIniOptions = { ...opts, base_url: opts.base_url || opts.url + ':' + (opts.port || 8332).toString(), transform: 'json', headers: { 'Content-Type': 'application/json' }, }; if (opts.auth) { if (!params.headers) { params.headers = {}; } (params.headers as AuthHeaders).Authorization = 'Basic ' + Buffer.from(opts.auth.user + ':' + opts.auth.pass, 'utf8').toString('base64'); } super(params); } /** * @description Get a block with a particular header hash * @param {object} [params] * @param {string} params.hash - The hash of the header of the block to get * @param {string} [params.format='json'] - Set to 'json' for decoded block contents in JSON, or 'bin' or 'hex' for a serialized block in binary or hex */ getBlock({ hash, format = 'json' }: BlockParams) { return this.get(`/rest/block/${hash}.${format}`); } /** * @description Get a block with a particular header hash (includes TXIDs for transactions within the block rather than the complete transactions) * @param {object} [params] * @param {string} params.hash - The hash of the header of the block to get * @param {string} [params.format='json'] - Set to 'json' for decoded block contents in JSON, or 'bin' or 'hex' for a serialized block in binary or hex */ getBlockNoTxDetails({ hash, format = 'json' }: BlockParams) { return this.get(`/rest/block/notxdetails/${hash}.${format}`); } /** * @description Get the hash of the block in the current best blockchain based on its height. * @param {object} [params] * @param {number} params.height - The height of the block * @param {string} [params.format='json'] - Set to `json`, `bin` or `hex`. */ getBlockHashByHeight({ height, format = 'json' }: BlockHeightParams) { return this.get(`/rest/blockhashbyheight/${height}.${format}`); } /** * @description Get information about the current state of the block chain. */ getChainInfo() { return this.get('rest/chaininfo.json'); } /** * @description Get an UTXO set given a set of outpoints. * @param {object} [params] * @param {boolean} [params.checkmempool=true] - Set to `true` to include transactions that are currently in the memory pool to the calculation * @param {Object|Object[]} params.outpoints - The list of outpoints to be queried. * @param {string} [params.format='json'] - Set to `json`, `bin` or `hex`. */ getUtxos({ checkmempool = true, outpoints, format = 'json' }: UtxosParams) { let uri = `rest/getutxos${checkmempool ? '/checkmempool' : ''}`; outpoints = !Array.isArray(outpoints) ? [outpoints] : outpoints; for (const { txid, n } of outpoints) { uri += `/${txid}-${n}`; } return this.get(uri + '.' + format); } /** * @description Get a specified amount of block headers in upward direction. * @param {object} [params] * @param {number} [params.count=1] - The amount of block headers in upward direction to return * @param {string} params.hash - The hash of the header of the block to get * @param {string} [params.format='json'] - Set to `json`, `bin` or `hex`. */ getHeaders({ count, hash, format = 'json' }: HeaderParams) { return this.get(`rest/headers/${count}/${hash}.${format}`); } /** * @description Get all transaction in the memory pool with detailed information. */ getMemPoolContents() { return this.get('rest/mempool/contents.json'); } /** * @description Get information about the node’s current transaction memory pool. */ getMemPoolInfo() { return this.get('rest/mempool/info.json'); } /** * @description Gets a hex-encoded serialized transaction or a JSON object describing the transaction. * @param {object} [params] * @param {string} params.txid - The TXID of the transaction to get. * @param {string} [params.format='json'] - Set to `json`, `bin` or `hex`. */ getTx({ txid, format = 'json' }: TxParams) { return this.get(`rest/tx/${txid}.${format}`); } }