diff --git a/src/bch-js.js b/src/bch-js.js index 9fc7be1..ce04a72 100644 --- a/src/bch-js.js +++ b/src/bch-js.js @@ -36,7 +36,6 @@ const DSProof = require('./dsproof') const Ecash = require('./ecash') // Indexers -const Ninsight = require('./ninsight') const Electrumx = require('./electrumx') const PsfSlpIndexer = require('./psf-slp-indexer') @@ -83,9 +82,6 @@ class BCHJS { // console.log(`apiToken: ${this.apiToken}`) - // Bitcoin.com Ninsight indexer - this.Ninsight = new Ninsight(config) - // ElectrumX indexer this.Electrumx = new Electrumx(libConfig) diff --git a/src/ninsight.js b/src/ninsight.js deleted file mode 100644 index 2839b91..0000000 --- a/src/ninsight.js +++ /dev/null @@ -1,319 +0,0 @@ -/* - This library interacts with the ninsight REST API endpoints operated by - Bitcoin.com -*/ - -const axios = require('axios') - -// let _this - -class Ninsight { - constructor (config) { - // this.restURL = config.restURL - // this.apiToken = config.apiToken - - // this.ninsightURL = `https://bch-explorer.api.bitcoin.com/v1/` - if (config) { - this.ninsightURL = config.ninsightURL - ? config.ninsightURL - : 'https://rest.bitcoin.com/v2' - } - - // Add JWT token to the authorization header. - this.axiosOptions = { - headers: { - authorization: `Token ${this.apiToken}`, - timeout: 15000 - } - } - - // _this = this - } - - /** - * @api Ninsight.utxo() utxo() - * @apiName Ninsight Utxo - * @apiGroup Ninsight - * @apiDescription Return list of uxto for address. - * - * @apiExample Example usage: - * (async () => { - * try { - * let utxo = await bchjs.Ninsight.utxo('bitcoincash:qzs02v05l7qs5s24srqju498qu55dwuj0cx5ehjm2c'); - * console.log(utxo); - * } catch(error) { - * console.error(error) - * } - * })() - * - * // [ - * // { - * // "txid": "d31dc2cf66fe4d3d3ae18e1065def58a64920746b1702b52f060e5edeea9883b", - * // "vout": 1, - * // "amount": 0.03608203, - * // "satoshis": 3608203, - * // "height": 585570, - * // "confirmations": 10392 - * // }, - * // { - * // "txid": "41e9a118765ecf7a1ba4487c0863e23dba343cc5880381a72f0365ac2546c5fa", - * // "vout": 0, - * // "amount": 0.03608203, - * // "satoshis": 3608203, - * // "height": 577125, - * // "confirmations": 18837 - * // } - * // ] - * - */ - async utxo (address) { - try { - // Handle single address. - if (typeof address === 'string') { - const response = await axios.post( - `${this.ninsightURL}/address/utxo`, - { - addresses: [address] - }, - this.axiosOptions - ) - return response.data - - // Handle array of addresses. - } else if (Array.isArray(address)) { - const response = await axios.post( - `${this.ninsightURL}/address/utxo`, - { - addresses: address - }, - this.axiosOptions - ) - - return response.data - } - - throw new Error('Input address must be a string or array of strings.') - } catch (error) { - if (error.response && error.response.data) throw error.response.data - else throw error - } - } - - /** - * @api Ninsight.unconfirmed() unconfirmed() - * @apiName Ninsight Unconfirmed Utxo - * @apiGroup Ninsight - * @apiDescription Returns a list of unconfirmed UTXOs for an address. - * - * @apiExample Example usage: - * (async () => { - * try { - * let utxo = await bchjs.Ninsight.unconfirmed('bitcoincash:qzs02v05l7qs5s24srqju498qu55dwuj0cx5ehjm2c'); - * console.log(utxo); - * } catch(error) { - * console.error(error) - * } - * })() - * - * // [ - * // { - * // "txid": "d31dc2cf66fe4d3d3ae18e1065def58a64920746b1702b52f060e5edeea9883b", - * // "vout": 1, - * // "amount": 0.03608203, - * // "satoshis": 3608203, - * // "confirmations": 0 - * // "ts": 1559670801 - * // }, - * // { - * // "txid": "41e9a118765ecf7a1ba4487c0863e23dba343cc5880381a72f0365ac2546c5fa", - * // "vout": 0, - * // "amount": 0.03608203, - * // "satoshis": 3608203, - * // "confirmations": 0 - * // "ts": 1559670902 - * // } - * // ] - * - */ - async unconfirmed (address) { - try { - if (typeof address === 'string') { - const response = await axios.post( - `${this.ninsightURL}/address/unconfirmed`, - { - addresses: [address] - }, - this.axiosOptions - ) - - return response.data - } else if (Array.isArray(address)) { - const response = await axios.post( - `${this.ninsightURL}/address/unconfirmed`, - { - addresses: address - }, - this.axiosOptions - ) - - return response.data - } - - throw new Error('Input address must be a string or array of strings.') - } catch (error) { - if (error.response && error.response.data) throw error.response.data - else throw error - } - } - - /** - * @api Ninsight.transactions() transactions() - * @apiName Ninsight TX History - * @apiGroup Ninsight - * @apiDescription Return transactions history for address. - * - * @apiExample Example usage: - * (async () => { - * try { - * let txs = await bchjs.Ninsight.transactions('bitcoincash:qzs02v05l7qs5s24srqju498qu55dwuj0cx5ehjm2c'); - * console.log(txs); - * } catch(error) { - * console.error(error) - * } - * })() - * - * // [ - * // { - * // "pagesTotal": 1, - * // "txs": [ - * // { - * // "txid": "ec7bc8349386e3e1939bbdc4f8092fdbdd6a380734e68486b558cd594c451d5b", - * // "version": 2, - * // "locktime": 0, - * // "vin": [ - * // { - * // "txid": "4f1fc57c33659628938db740449bf92fb75799e1d5750a4aeef80eb52d6df1e0", - * // "vout": 0, - * // "sequence": 4294967295, - * // "n": 0, - * // ... - * // } - * // ... - * // ] - * // ... - * // } - * // ], - * // "legacyAddress": "1LpbYkEM5cryfhs58tH8c93p4SGzit7UrP", - * // "cashAddress": "bitcoincash:qrvk436u4r0ew2wj0rd9pnxhx4w90p2yfc29ta0d2n", - * // "currentPage": 0 - * // } - * // ] - * // - * - */ - async transactions (address) { - try { - if (typeof address === 'string') { - const response = await axios.post( - `${this.ninsightURL}/address/transactions`, - { - addresses: [address] - }, - this.axiosOptions - ) - - return response.data - } else if (Array.isArray(address)) { - const response = await axios.post( - `${this.ninsightURL}/address/transactions`, - { - addresses: address - }, - this.axiosOptions - ) - - return response.data - } - - throw new Error('Input address must be a string or array of strings.') - } catch (error) { - if (error.response && error.response.data) throw error.response.data - else throw error - } - } - - /** - * @api Ninsight.txDetails() txDetails() - * @apiName Ninsight TX Details - * @apiGroup Ninsight - * @apiDescription Return transactions details for address(es). - * - * @apiExample Example usage: - * (async () => { - * try { - * let result = await bchjs.Ninsight.txDetails('fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33'); - * console.log(result); - * } catch(error) { - * console.error(error) - * } - * })() - * - * // [ - * // { - * // "txid": "fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33", - * // "version": 1, - * // "locktime": 0, - * // "vin": [ - * // { - * // "sequence": 4294967295, - * // "n": 0 - * // } - * // ], - * // "vout": [ - * // ... - * // ], - * // "blockhash": "00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09", - * // "blockheight": 1000, - * // "confirmations": 659909, - * // "time": 1232346882, - * // "blocktime": 1232346882, - * // "firstSeenTime": null, - * // "valueOut": 50, - * // "size": 135 - * // } - * // ] - * - */ - async txDetails (txid) { - try { - if (typeof txid === 'string') { - const response = await axios.post( - `${this.ninsightURL}/transaction/details`, - { - txids: [txid] - }, - this.axiosOptions - ) - - return response.data - } else if (Array.isArray(txid)) { - const response = await axios.post( - `${this.ninsightURL}/transaction/details`, - { - txids: txid - }, - this.axiosOptions - ) - - return response.data - } - - throw new Error('Transaction ID must be a string or array of strings.') - } catch (error) { - if (error.response && error.response.data) throw error.response.data - else throw error - } - } -} - -module.exports = Ninsight diff --git a/test/integration/transaction-integration.js b/test/integration/transaction-integration.js index 57a4136..b95a296 100644 --- a/test/integration/transaction-integration.js +++ b/test/integration/transaction-integration.js @@ -11,72 +11,74 @@ describe('#Transaction', () => { if (process.env.IS_USING_FREE_TIER) await bchjs.Util.sleep(1000) }) - describe('#getOld', () => { - it('should get details about a non-SLP transaction', async () => { - const txid = - '2b37bdb3b63dd0bca720437754a36671431a950e684b64c44ea910ea9d5297c7' + if (process.env.TESTSLP) { + describe('#getOld', () => { + it('should get details about a non-SLP transaction', async () => { + const txid = + '2b37bdb3b63dd0bca720437754a36671431a950e684b64c44ea910ea9d5297c7' - const result = await bchjs.Transaction.getOld(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) + const result = await bchjs.Transaction.getOld(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) - // Assert that there are stanardized properties. - assert.property(result, 'txid') - assert.property(result, 'vin') - assert.property(result, 'vout') - assert.property(result.vout[0], 'value') - assert.property(result.vout[0].scriptPubKey, 'addresses') + // Assert that there are stanardized properties. + assert.property(result, 'txid') + assert.property(result, 'vin') + assert.property(result, 'vout') + assert.property(result.vout[0], 'value') + assert.property(result.vout[0].scriptPubKey, 'addresses') - // Assert that added properties exist. - assert.property(result.vin[0], 'address') - assert.property(result.vin[0], 'value') - assert.property(result, 'isValidSLPTx') - assert.equal(result.isValidSLPTx, false) + // Assert that added properties exist. + assert.property(result.vin[0], 'address') + assert.property(result.vin[0], 'value') + assert.property(result, 'isValidSLPTx') + assert.equal(result.isValidSLPTx, false) + }) + + it('should get details about a SLP transaction', async () => { + const txid = + '266844d53e46bbd7dd37134688dffea6e54d944edff27a0add63dd0908839bc1' + + const result = await bchjs.Transaction.getOld(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + // Assert that there are stanardized properties. + assert.property(result, 'txid') + assert.property(result, 'vin') + assert.property(result, 'vout') + assert.property(result.vout[0], 'value') + assert.property(result.vout[1].scriptPubKey, 'addresses') + + // Assert that added properties exist. + assert.property(result.vout[0], 'tokenQty') + assert.equal(result.vout[0].tokenQty, null) + assert.property(result.vin[0], 'address') + assert.property(result.vin[0], 'value') + assert.property(result.vin[0], 'tokenQty') + assert.property(result, 'isValidSLPTx') + assert.equal(result.isValidSLPTx, true) + }) + + // it('should get problematic transaction', async () => { + // const txid = 'a55515de32577e296c512840bcaabed5823bb773fb4f8fd8e5197cc96cbc54d1' + // + // const result = await bchjs.Transaction.get(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + // }) + + // TX a19f2f395a8b0e15b6202944c56834367d128f1e3630486a4756de53424a46fe has + // an input TXID (bd84bc1dd5ecd976165892306992401272f6bedeb37d7b2cdbf74fc4a55967a6) + // that is also a valid SLP tx, but is unrelated. Both TXs pass DAG validation, + // but for separate tokens. + it('should get problematic transaction', async () => { + const txid = + 'a19f2f395a8b0e15b6202944c56834367d128f1e3630486a4756de53424a46fe' + + const result = await bchjs.Transaction.getOld(txid) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + // The token ID should equal the txid for this Vin. + assert.equal(result.vin[2].txid, result.vin[2].tokenId) + }) }) - - it('should get details about a SLP transaction', async () => { - const txid = - '266844d53e46bbd7dd37134688dffea6e54d944edff27a0add63dd0908839bc1' - - const result = await bchjs.Transaction.getOld(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - // Assert that there are stanardized properties. - assert.property(result, 'txid') - assert.property(result, 'vin') - assert.property(result, 'vout') - assert.property(result.vout[0], 'value') - assert.property(result.vout[1].scriptPubKey, 'addresses') - - // Assert that added properties exist. - assert.property(result.vout[0], 'tokenQty') - assert.equal(result.vout[0].tokenQty, null) - assert.property(result.vin[0], 'address') - assert.property(result.vin[0], 'value') - assert.property(result.vin[0], 'tokenQty') - assert.property(result, 'isValidSLPTx') - assert.equal(result.isValidSLPTx, true) - }) - - // it('should get problematic transaction', async () => { - // const txid = 'a55515de32577e296c512840bcaabed5823bb773fb4f8fd8e5197cc96cbc54d1' - // - // const result = await bchjs.Transaction.get(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - // }) - - // TX a19f2f395a8b0e15b6202944c56834367d128f1e3630486a4756de53424a46fe has - // an input TXID (bd84bc1dd5ecd976165892306992401272f6bedeb37d7b2cdbf74fc4a55967a6) - // that is also a valid SLP tx, but is unrelated. Both TXs pass DAG validation, - // but for separate tokens. - it('should get problematic transaction', async () => { - const txid = - 'a19f2f395a8b0e15b6202944c56834367d128f1e3630486a4756de53424a46fe' - - const result = await bchjs.Transaction.getOld(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - // The token ID should equal the txid for this Vin. - assert.equal(result.vin[2].txid, result.vin[2].tokenId) - }) - }) + } }) diff --git a/test/unit/fixtures/ninsight-mock.js b/test/unit/fixtures/ninsight-mock.js deleted file mode 100644 index f455459..0000000 --- a/test/unit/fixtures/ninsight-mock.js +++ /dev/null @@ -1,170 +0,0 @@ -/* - Mocking data for unit tests for the Ninsight library. -*/ - -const utxo = { - utxos: [ - { - txid: '2b37bdb3b63dd0bca720437754a36671431a950e684b64c44ea910ea9d5297c7', - vout: 0, - amount: 0.00001, - satoshis: 1000, - height: 602405, - confirmations: 36459 - } - ], - legacyAddress: '15NCRBJsHaJy8As5bX1oh2YauRejnZ1MKF', - cashAddress: 'bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9', - slpAddress: 'simpleledger:qqh793x9au6ehvh7r2zflzguanlme760wuwzunhjfm', - scriptPubKey: '76a9142fe2c4c5ef359bb2fe1a849f891cecffbcfb4f7788ac', - asm: - 'OP_DUP OP_HASH160 2fe2c4c5ef359bb2fe1a849f891cecffbcfb4f77 OP_EQUALVERIFY OP_CHECKSIG' -} - -const unconfirmed = { - utxos: [ - { - txid: '3904ffe6f8fba4ceda5e887130f60fcb18bdc7dcee10392a57f89475c5c108f1', - vout: 0, - amount: 0.03608203, - satoshis: 3608203, - confirmations: 0, - ts: 1559670801 - } - ], - legacyAddress: '1AyWs8U4HUnTLmxxFiGoJbsXauRsvBrcKW', - cashAddress: 'bitcoincash:qpkkjkhe29mqhqmu3evtq3dsnruuzl3rku6usknlh5', - slpAddress: 'simpleledger:qpkkjkhe29mqhqmu3evtq3dsnruuzl3rkuk8mdxlf2', - scriptPubKey: '76a9146d695af951760b837c8e58b045b098f9c17e23b788ac' -} - -const utxoPost = [utxo, utxo] -const unconfirmedPost = [unconfirmed, unconfirmed] - -const transactions = { - pagesTotal: 1, - txs: [ - { - txid: 'ec7bc8349386e3e1939bbdc4f8092fdbdd6a380734e68486b558cd594c451d5b', - version: 2, - locktime: 0, - vin: [ - { - txid: - '4f1fc57c33659628938db740449bf92fb75799e1d5750a4aeef80eb52d6df1e0', - vout: 0, - sequence: 4294967295, - n: 0, - scriptSig: { - hex: - '483045022100a3662a19ae384a1ceddea57765e425e61b04823e976d574da3911ac6b55d7f9b02200e571d985bce987675a2d58587a346fa40c39f4df13dc88548a92c52d5b24422412103f953f7630acc15bd3f5078c698f3af777286ae955b57e4857c158f75d87adb5f', - asm: - '3045022100a3662a19ae384a1ceddea57765e425e61b04823e976d574da3911ac6b55d7f9b02200e571d985bce987675a2d58587a346fa40c39f4df13dc88548a92c52d5b24422[ALL|FORKID] 03f953f7630acc15bd3f5078c698f3af777286ae955b57e4857c158f75d87adb5f' - }, - addr: '17HPz8RQ4XM6mjre6aspvqyj1j648CZidM', - valueSat: 1111, - value: 0.00001111, - doubleSpentTxID: null - }, - { - txid: - '126d62c299e7e14c66fe0b485d13082c23641f003690462046bc24ad2d1180c1', - vout: 0, - sequence: 4294967295, - n: 1, - scriptSig: { - hex: - '47304402203e3f923207111ff9bbd2fb5ab1a49a9145ad809ee0cad0e0ddaed64bfe38dc16022012ee288fb413bd500c63f8bb95e46b6b57d34762decd46b7188478a1c398eeda412103f953f7630acc15bd3f5078c698f3af777286ae955b57e4857c158f75d87adb5f', - asm: - '304402203e3f923207111ff9bbd2fb5ab1a49a9145ad809ee0cad0e0ddaed64bfe38dc16022012ee288fb413bd500c63f8bb95e46b6b57d34762decd46b7188478a1c398eeda[ALL|FORKID] 03f953f7630acc15bd3f5078c698f3af777286ae955b57e4857c158f75d87adb5f' - }, - addr: '17HPz8RQ4XM6mjre6aspvqyj1j648CZidM', - valueSat: 1000, - value: 0.00001, - doubleSpentTxID: null - } - ], - vout: [ - { - value: '0.00001736', - n: 0, - scriptPubKey: { - hex: '76a914d96ac75ca8df9729d278da50ccd7355c5785444e88ac', - asm: - 'OP_DUP OP_HASH160 d96ac75ca8df9729d278da50ccd7355c5785444e OP_EQUALVERIFY OP_CHECKSIG', - addresses: ['1LpbYkEM5cryfhs58tH8c93p4SGzit7UrP'], - type: 'pubkeyhash' - }, - spentTxId: null, - spentIndex: null, - spentHeight: null - } - ], - blockheight: -1, - confirmations: 0, - time: 1559673337, - valueOut: 0.00001736, - size: 339, - valueIn: 0.00002111, - fees: 0.00000375 - } - ], - legacyAddress: '1LpbYkEM5cryfhs58tH8c93p4SGzit7UrP', - cashAddress: 'bitcoincash:qrvk436u4r0ew2wj0rd9pnxhx4w90p2yfc29ta0d2n', - currentPage: 0 -} - -const transactionsPost = [transactions, transactions] - -const details = { - txid: 'fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33', - version: 1, - locktime: 0, - vin: [ - { - coinbase: '04ffff001d02fd04', - sequence: 4294967295, - n: 0 - } - ], - vout: [ - { - value: '50.00000000', - n: 0, - scriptPubKey: { - hex: - '4104f5eeb2b10c944c6b9fbcfff94c35bdeecd93df977882babc7f3a2cf7f5c81d3b09a68db7f0e04f21de5d4230e75e6dbe7ad16eefe0d4325a62067dc6f369446aac', - asm: - '04f5eeb2b10c944c6b9fbcfff94c35bdeecd93df977882babc7f3a2cf7f5c81d3b09a68db7f0e04f21de5d4230e75e6dbe7ad16eefe0d4325a62067dc6f369446a OP_CHECKSIG', - addresses: ['1BW18n7MfpU35q4MTBSk8pse3XzQF8XvzT'], - type: 'pubkeyhash', - cashAddrs: ['bitcoincash:qpej6mkrwca4tvy2snq4crhrf88v4ljspysx0ueetk'] - }, - spentTxId: null, - spentIndex: null, - spentHeight: null - } - ], - blockhash: - '00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09', - blockheight: 1000, - confirmations: 585610, - time: 1232346882, - blocktime: 1232346882, - isCoinBase: true, - valueOut: 50, - size: 135 -} - -const detailsPost = [details, details] - -module.exports = { - utxo, - utxoPost, - unconfirmed, - unconfirmedPost, - transactions, - transactionsPost, - details, - detailsPost -} diff --git a/test/unit/ninsight.js b/test/unit/ninsight.js deleted file mode 100644 index 45a898e..0000000 --- a/test/unit/ninsight.js +++ /dev/null @@ -1,255 +0,0 @@ -const chai = require('chai') -const assert = chai.assert -const axios = require('axios') -const sinon = require('sinon') - -const BCHJS = require('../../src/bch-js') -const bchjs = new BCHJS() - -const mockData = require('./fixtures/ninsight-mock') - -describe('#Ninsight', () => { - let sandbox - beforeEach(() => (sandbox = sinon.createSandbox())) - afterEach(() => sandbox.restore()) - - describe('#utxo', () => { - it('should throw an error for improper input', async () => { - try { - const addr = 12345 - - await bchjs.Ninsight.utxo(addr) - assert.equal(true, false, 'Unexpected result!') - } catch (err) { - // console.log(`err: `, err) - assert.include( - err.message, - 'Input address must be a string or array of strings.' - ) - } - }) - - it('should GET utxos for a single address', async () => { - // Stub the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.utxo }) - - const addr = 'bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9' - - const result = await bchjs.Ninsight.utxo(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.property(result, 'utxos') - assert.property(result, 'legacyAddress') - assert.property(result, 'cashAddress') - assert.property(result, 'slpAddress') - assert.property(result, 'scriptPubKey') - assert.property(result, 'asm') - - assert.isArray(result.utxos) - - assert.property(result.utxos[0], 'txid') - assert.property(result.utxos[0], 'vout') - assert.property(result.utxos[0], 'amount') - assert.property(result.utxos[0], 'satoshis') - assert.property(result.utxos[0], 'height') - assert.property(result.utxos[0], 'confirmations') - }) - - it('should POST utxo details for an array of addresses', async () => { - // Mock the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.utxoPost }) - - const addr = [ - 'bitcoincash:qp3sn6vlwz28ntmf3wmyra7jqttfx7z6zgtkygjhc7', - 'bitcoincash:qz0us0z6ucpqt07jgpad0shgh7xmwxyr3ynlcsq0wr' - ] - - const result = await bchjs.Ninsight.utxo(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.isArray(result[0].utxos) - - assert.property(result[0], 'utxos') - assert.property(result[0], 'legacyAddress') - assert.property(result[0], 'cashAddress') - assert.property(result[0], 'slpAddress') - assert.property(result[0], 'scriptPubKey') - assert.property(result[0], 'asm') - }) - }) - - describe('#unconfirmed', () => { - it('should throw an error for improper input', async () => { - try { - const addr = 12345 - - await bchjs.Ninsight.unconfirmed(addr) - assert.equal(true, false, 'Unexpected result!') - } catch (err) { - assert.include( - err.message, - 'Input address must be a string or array of strings.' - ) - } - }) - - it('should POST utxos for a single address', async () => { - // Stub the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.unconfirmed }) - - const addr = 'bitcoincash:qpkkjkhe29mqhqmu3evtq3dsnruuzl3rku6usknlh5' - - const result = await bchjs.Ninsight.unconfirmed(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.property(result, 'utxos') - assert.property(result, 'legacyAddress') - assert.property(result, 'cashAddress') - assert.property(result, 'slpAddress') - assert.property(result, 'scriptPubKey') - - assert.isArray(result.utxos) - - assert.property(result.utxos[0], 'txid') - assert.property(result.utxos[0], 'vout') - assert.property(result.utxos[0], 'amount') - assert.property(result.utxos[0], 'satoshis') - assert.property(result.utxos[0], 'confirmations') - assert.property(result.utxos[0], 'ts') - }) - - it('should POST utxo details for an array of addresses', async () => { - // Mock the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.unconfirmedPost }) - - const addr = [ - 'bitcoincash:qpkkjkhe29mqhqmu3evtq3dsnruuzl3rku6usknlh5', - 'bitcoincash:qz0us0z6ucpqt07jgpad0shgh7xmwxyr3ynlcsq0wr' - ] - - const result = await bchjs.Ninsight.unconfirmed(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.isArray(result[0].utxos) - - assert.property(result[0], 'utxos') - assert.property(result[0], 'legacyAddress') - assert.property(result[0], 'cashAddress') - assert.property(result[0], 'slpAddress') - assert.property(result[0], 'scriptPubKey') - }) - }) - - describe('#transactions', () => { - it('should throw an error for improper input', async () => { - try { - const addr = 12345 - - await bchjs.Ninsight.transactions(addr) - assert.equal(true, false, 'Unexpected result!') - } catch (err) { - // console.log(`err: `, err) - assert.include( - err.message, - 'Input address must be a string or array of strings.' - ) - } - }) - it('should POST transaction history for a single address', async () => { - // Stub the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.transactionsPost }) - - const addr = 'bitcoincash:qqh793x9au6ehvh7r2zflzguanlme760wuzehgzjh9' - - const result = await bchjs.Ninsight.transactions(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.property(result[0], 'cashAddress') - assert.property(result[0], 'legacyAddress') - assert.property(result[0], 'txs') - assert.isArray(result[0].txs) - assert.property(result[0].txs[0], 'txid') - assert.property(result[0].txs[0], 'vin') - assert.property(result[0].txs[0], 'vout') - }) - it('should POST transaction history for an array of addresses', async () => { - // Mock the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.transactionsPost }) - - const addr = [ - 'bitcoincash:qp3sn6vlwz28ntmf3wmyra7jqttfx7z6zgtkygjhc7', - 'bitcoincash:qz0us0z6ucpqt07jgpad0shgh7xmwxyr3ynlcsq0wr' - ] - - const result = await bchjs.Ninsight.transactions(addr) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.property(result[0], 'cashAddress') - assert.property(result[0], 'legacyAddress') - assert.property(result[0], 'txs') - assert.isArray(result[0].txs) - assert.property(result[0].txs[0], 'txid') - }) - }) - describe('#txDetails', () => { - it('should throw an error for improper input', async () => { - try { - const txid = 12345 - - await bchjs.Ninsight.txDetails(txid) - assert.equal(true, false, 'Unexpected result!') - } catch (err) { - // console.log(`err: `, err) - assert.include( - err.message, - 'Transaction ID must be a string or array of strings.' - ) - } - }) - it('should POST transaction details for a single TxID', async () => { - // Stub the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.detailsPost }) - - const txid = 'fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33' - - const result = await bchjs.Ninsight.txDetails(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.property(result[0], 'txid') - assert.property(result[0], 'version') - assert.property(result[0], 'locktime') - assert.property(result[0], 'vin') - assert.property(result[0], 'vout') - assert.property(result[0], 'blockhash') - assert.property(result[0], 'blockheight') - assert.property(result[0], 'confirmations') - assert.property(result[0], 'time') - assert.property(result[0], 'blocktime') - assert.property(result[0], 'isCoinBase') - assert.property(result[0], 'valueOut') - assert.property(result[0], 'size') - }) - it('should POST transaction details for an array of TxIDs', async () => { - // Stub the network call. - sandbox.stub(axios, 'post').resolves({ data: mockData.detailsPost }) - - const txid = [ - 'fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33', - 'fe28050b93faea61fa88c4c630f0e1f0a1c24d0082dd0e10d369e13212128f33' - ] - - const result = await bchjs.Ninsight.txDetails(txid) - // console.log(`result: ${JSON.stringify(result, null, 2)}`) - - assert.isArray(result) - assert.property(result[0], 'txid') - assert.property(result[0], 'vin') - assert.property(result[0], 'vout') - }) - }) -})