From 0a14ca08a4947123c8c20e503ab47c54aa01ab96 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 27 Sep 2020 17:26:34 -0700 Subject: [PATCH] fix(hydrateUtxos): Adjusting input to match output of Electrumx.utxo() --- src/routes/v3/slp.js | 16 ++++-- test/v3/integration/slp.js | 114 +++++++++++++++++++++++-------------- test/v3/slp.js | 89 +++++++++++++++-------------- 3 files changed, 131 insertions(+), 88 deletions(-) diff --git a/src/routes/v3/slp.js b/src/routes/v3/slp.js index 43e3b42..3a7ef33 100644 --- a/src/routes/v3/slp.js +++ b/src/routes/v3/slp.js @@ -1567,12 +1567,20 @@ class Slp { }) } - // Get Token Utxo Details - const details = await _this.bchjs.SLP.Utils.tokenUtxoDetails(utxos) - // console.log('details : ', details) + // Loop through each address and query the UTXOs for that element. + for (let i = 0; i < utxos.length; i++) { + const theseUtxos = utxos[i].utxos + + // Get SLP token details. + const details = await _this.bchjs.SLP.Utils.tokenUtxoDetails(theseUtxos) + // console.log('details : ', details) + + // Replace the original UTXO data with the hydrated data. + utxos[i].utxos = details + } res.status(200) - return res.json({ slpUtxos: details }) + return res.json({ slpUtxos: utxos }) } catch (err) { wlogger.error('Error in slp.js/hydrateUtxos().', err) diff --git a/test/v3/integration/slp.js b/test/v3/integration/slp.js index 9f41c70..279d077 100644 --- a/test/v3/integration/slp.js +++ b/test/v3/integration/slp.js @@ -22,6 +22,9 @@ if (!process.env.SLPDB_URL) { const SLP = require('../../../src/routes/v3/slp') const slp = new SLP() +const BCHJS = require('@psf/bch-js') +const bchjs = new BCHJS() + const { mockReq, mockRes } = require('../mocks/express-mocks') describe('#slp', () => { @@ -126,22 +129,26 @@ describe('#slp', () => { it('should return utxo details', async () => { const utxos = [ { - txid: - 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', - vout: 3, - value: '6816', - height: 606848, - confirmations: 13, - satoshis: 6816 - }, - { - txid: - 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', - vout: 2, - value: '546', - height: 606848, - confirmations: 13, - satoshis: 546 + utxos: [ + { + txid: + 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', + vout: 3, + value: '6816', + height: 606848, + confirmations: 13, + satoshis: 6816 + }, + { + txid: + 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', + vout: 2, + value: '546', + height: 606848, + confirmations: 13, + satoshis: 546 + } + ] } ] @@ -151,36 +158,59 @@ describe('#slp', () => { // Test the general structure of the output. assert.isArray(result.slpUtxos) - assert.equal(result.slpUtxos.length, 2) + assert.equal(result.slpUtxos.length, 1) + assert.equal(result.slpUtxos[0].utxos.length, 2) // Test the non-slp UTXO. - assert.property(result.slpUtxos[0], 'txid') - assert.property(result.slpUtxos[0], 'vout') - assert.property(result.slpUtxos[0], 'value') - assert.property(result.slpUtxos[0], 'height') - assert.property(result.slpUtxos[0], 'confirmations') - assert.property(result.slpUtxos[0], 'satoshis') - assert.property(result.slpUtxos[0], 'isValid') - assert.equal(result.slpUtxos[0].isValid, false) + assert.property(result.slpUtxos[0].utxos[0], 'txid') + assert.property(result.slpUtxos[0].utxos[0], 'vout') + assert.property(result.slpUtxos[0].utxos[0], 'value') + assert.property(result.slpUtxos[0].utxos[0], 'height') + assert.property(result.slpUtxos[0].utxos[0], 'confirmations') + assert.property(result.slpUtxos[0].utxos[0], 'satoshis') + assert.property(result.slpUtxos[0].utxos[0], 'isValid') + assert.equal(result.slpUtxos[0].utxos[0].isValid, false) // Test the slp UTXO. - assert.property(result.slpUtxos[1], 'txid') - assert.property(result.slpUtxos[1], 'vout') - assert.property(result.slpUtxos[1], 'value') - assert.property(result.slpUtxos[1], 'height') - assert.property(result.slpUtxos[1], 'confirmations') - assert.property(result.slpUtxos[1], 'satoshis') - assert.property(result.slpUtxos[1], 'isValid') - assert.equal(result.slpUtxos[1].isValid, true) - assert.property(result.slpUtxos[1], 'transactionType') - assert.property(result.slpUtxos[1], 'tokenId') - assert.property(result.slpUtxos[1], 'tokenTicker') - assert.property(result.slpUtxos[1], 'tokenName') - assert.property(result.slpUtxos[1], 'tokenDocumentUrl') - assert.property(result.slpUtxos[1], 'tokenDocumentHash') - assert.property(result.slpUtxos[1], 'decimals') - assert.property(result.slpUtxos[1], 'tokenType') - assert.property(result.slpUtxos[1], 'tokenQty') + assert.property(result.slpUtxos[0].utxos[1], 'txid') + assert.property(result.slpUtxos[0].utxos[1], 'vout') + assert.property(result.slpUtxos[0].utxos[1], 'value') + assert.property(result.slpUtxos[0].utxos[1], 'height') + assert.property(result.slpUtxos[0].utxos[1], 'confirmations') + assert.property(result.slpUtxos[0].utxos[1], 'satoshis') + assert.property(result.slpUtxos[0].utxos[1], 'isValid') + assert.equal(result.slpUtxos[0].utxos[1].isValid, true) + assert.property(result.slpUtxos[0].utxos[1], 'transactionType') + assert.property(result.slpUtxos[0].utxos[1], 'tokenId') + assert.property(result.slpUtxos[0].utxos[1], 'tokenTicker') + assert.property(result.slpUtxos[0].utxos[1], 'tokenName') + assert.property(result.slpUtxos[0].utxos[1], 'tokenDocumentUrl') + assert.property(result.slpUtxos[0].utxos[1], 'tokenDocumentHash') + assert.property(result.slpUtxos[0].utxos[1], 'decimals') + assert.property(result.slpUtxos[0].utxos[1], 'tokenType') + assert.property(result.slpUtxos[0].utxos[1], 'tokenQty') + }) + + it('should process data directly from Electrumx', async () => { + const addrs = [ + 'bitcoincash:qq6mvsm7l92d77zpymmltvaw09p5uzghyuyx7spygg', + 'bitcoincash:qpjdrs8qruzh8xvusdfmutjx62awcepnhyperm3g89', + 'bitcoincash:qzygn28zpgeemnptkn26xzyuzzfu9l8f9vfvq7kptk' + ] + + const utxos = await bchjs.Electrumx.utxo(addrs) + // console.log(`utxos: ${JSON.stringify(utxos, null, 2)}`) + + req.body.utxos = utxos.utxos + const result = await slp.hydrateUtxos(req, res) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + // Test the general structure of the output. + assert.isArray(result.slpUtxos) + assert.equal(result.slpUtxos.length, 3) + assert.equal(result.slpUtxos[0].utxos.length, 1) + assert.equal(result.slpUtxos[1].utxos.length, 1) + assert.equal(result.slpUtxos[2].utxos.length, 2) }) }) }) diff --git a/test/v3/slp.js b/test/v3/slp.js index 34a4d36..4c1d517 100644 --- a/test/v3/slp.js +++ b/test/v3/slp.js @@ -938,22 +938,26 @@ describe('#SLP', () => { it('should return utxo details', async () => { const utxos = [ { - txid: - 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', - vout: 3, - value: '6816', - height: 606848, - confirmations: 13, - satoshis: 6816 - }, - { - txid: - 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', - vout: 2, - value: '546', - height: 606848, - confirmations: 13, - satoshis: 546 + utxos: [ + { + txid: + 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', + vout: 3, + value: '6816', + height: 606848, + confirmations: 13, + satoshis: 6816 + }, + { + txid: + 'd56a2b446d8149c39ca7e06163fe8097168c3604915f631bc58777d669135a56', + vout: 2, + value: '546', + height: 606848, + confirmations: 13, + satoshis: 546 + } + ] } ] @@ -998,36 +1002,37 @@ describe('#SLP', () => { // Test the general structure of the output. assert.isArray(result.slpUtxos) - assert.equal(result.slpUtxos.length, 2) + assert.equal(result.slpUtxos.length, 1) + assert.equal(result.slpUtxos[0].utxos.length, 2) // Test the non-slp UTXO. - assert.property(result.slpUtxos[0], 'txid') - assert.property(result.slpUtxos[0], 'vout') - assert.property(result.slpUtxos[0], 'value') - assert.property(result.slpUtxos[0], 'height') - assert.property(result.slpUtxos[0], 'confirmations') - assert.property(result.slpUtxos[0], 'satoshis') - assert.property(result.slpUtxos[0], 'isValid') - assert.equal(result.slpUtxos[0].isValid, false) + assert.property(result.slpUtxos[0].utxos[0], 'txid') + assert.property(result.slpUtxos[0].utxos[0], 'vout') + assert.property(result.slpUtxos[0].utxos[0], 'value') + assert.property(result.slpUtxos[0].utxos[0], 'height') + assert.property(result.slpUtxos[0].utxos[0], 'confirmations') + assert.property(result.slpUtxos[0].utxos[0], 'satoshis') + assert.property(result.slpUtxos[0].utxos[0], 'isValid') + assert.equal(result.slpUtxos[0].utxos[0].isValid, false) // Test the slp UTXO. - assert.property(result.slpUtxos[1], 'txid') - assert.property(result.slpUtxos[1], 'vout') - assert.property(result.slpUtxos[1], 'value') - assert.property(result.slpUtxos[1], 'height') - assert.property(result.slpUtxos[1], 'confirmations') - assert.property(result.slpUtxos[1], 'satoshis') - assert.property(result.slpUtxos[1], 'isValid') - assert.equal(result.slpUtxos[1].isValid, true) - assert.property(result.slpUtxos[1], 'transactionType') - assert.property(result.slpUtxos[1], 'tokenId') - assert.property(result.slpUtxos[1], 'tokenTicker') - assert.property(result.slpUtxos[1], 'tokenName') - assert.property(result.slpUtxos[1], 'tokenDocumentUrl') - assert.property(result.slpUtxos[1], 'tokenDocumentHash') - assert.property(result.slpUtxos[1], 'decimals') - assert.property(result.slpUtxos[1], 'tokenType') - assert.property(result.slpUtxos[1], 'tokenQty') + assert.property(result.slpUtxos[0].utxos[1], 'txid') + assert.property(result.slpUtxos[0].utxos[1], 'vout') + assert.property(result.slpUtxos[0].utxos[1], 'value') + assert.property(result.slpUtxos[0].utxos[1], 'height') + assert.property(result.slpUtxos[0].utxos[1], 'confirmations') + assert.property(result.slpUtxos[0].utxos[1], 'satoshis') + assert.property(result.slpUtxos[0].utxos[1], 'isValid') + assert.equal(result.slpUtxos[0].utxos[1].isValid, true) + assert.property(result.slpUtxos[0].utxos[1], 'transactionType') + assert.property(result.slpUtxos[0].utxos[1], 'tokenId') + assert.property(result.slpUtxos[0].utxos[1], 'tokenTicker') + assert.property(result.slpUtxos[0].utxos[1], 'tokenName') + assert.property(result.slpUtxos[0].utxos[1], 'tokenDocumentUrl') + assert.property(result.slpUtxos[0].utxos[1], 'tokenDocumentHash') + assert.property(result.slpUtxos[0].utxos[1], 'decimals') + assert.property(result.slpUtxos[0].utxos[1], 'tokenType') + assert.property(result.slpUtxos[0].utxos[1], 'tokenQty') }) }) })