From acdee61a1b4789275cec6fa7f3f45df5f85ad5e6 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Sun, 10 Jul 2022 19:09:12 -0700 Subject: [PATCH] fix(electrumx.getBalance()): Allowing ecash addresses to pass through --- src/routes/v5/electrumx.js | 28 ++++++++++++++++++++-------- test/v5/a01-electrumx.js | 30 ++++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/routes/v5/electrumx.js b/src/routes/v5/electrumx.js index 2c4be45..77a9f82 100644 --- a/src/routes/v5/electrumx.js +++ b/src/routes/v5/electrumx.js @@ -96,20 +96,32 @@ class Electrum { }) } - // Ensure the address is in cash address format. - const cashAddr = _this.bchjs.Address.toCashAddress(address) - - // Prevent a common user error. Ensure they are using the correct network address. - const networkIsValid = _this.routeUtils.validateNetwork(cashAddr) - if (!networkIsValid) { + if (!address) { res.status(400) return res.json({ success: false, - error: - 'Invalid network. Trying to use a testnet address on mainnet, or vice versa.' + error: 'address is empty' }) } + let cashAddr = address + + if (!address.includes('ecash')) { + // Ensure the address is in cash address format. + cashAddr = _this.bchjs.Address.toCashAddress(address) + + // Prevent a common user error. Ensure they are using the correct network address. + const networkIsValid = _this.routeUtils.validateNetwork(cashAddr) + if (!networkIsValid) { + res.status(400) + return res.json({ + success: false, + error: + 'Invalid network. Trying to use a testnet address on mainnet, or vice versa.' + }) + } + } + wlogger.debug( 'Executing electrumx/getBalance with this address: ', cashAddr diff --git a/test/v5/a01-electrumx.js b/test/v5/a01-electrumx.js index adf5a6b..64dc9c5 100644 --- a/test/v5/a01-electrumx.js +++ b/test/v5/a01-electrumx.js @@ -113,10 +113,10 @@ describe('#Electrumx', () => { const result = await electrumxRoute.getBalance(req, res) // console.log(`result: ${util.inspect(result)}`) - assert.equal(res.statusCode, 422, 'Expect 422 status code') + assert.equal(res.statusCode, 400, 'Expect 400 status code') assert.property(result, 'error') - assert.include(result.error, 'Unsupported address format') + assert.include(result.error, 'address is empty') assert.property(result, 'success') assert.equal(result.success, false) @@ -207,7 +207,33 @@ describe('#Electrumx', () => { assert.property(result.balance, 'confirmed') assert.property(result.balance, 'unconfirmed') }) + + it('should get balance for a single eCash address', async () => { + req.params.address = + 'ecash:qr5c4hfy52zn87484cucvzle5pljz0gtr5vhtw9z09' + + // Mock unit tests to prevent live network calls. + if (process.env.TEST === 'unit') { + electrumxRoute.isReady = true // Force flag. + + sandbox + .stub(electrumxRoute.axios, 'get') + .resolves({ data: mockData.balance }) + } + + // Call the details API. + const result = await electrumxRoute.getBalance(req, res) + // console.log(`result: ${JSON.stringify(result, null, 2)}`) + + assert.property(result, 'success') + assert.equal(result.success, true) + + assert.property(result, 'balance') + assert.property(result.balance, 'confirmed') + assert.property(result.balance, 'unconfirmed') + }) }) + describe('#balanceBulk', () => { it('should throw 400 if addresses is empty', async () => { const result = await electrumxRoute.balanceBulk(req, res)