From 855c1fd341352e140d8d7c26f52c113c1bd9e271 Mon Sep 17 00:00:00 2001 From: chiguireitor Date: Thu, 28 Dec 2017 22:28:00 -0400 Subject: [PATCH] Added support for a "balance" endpoint --- index.js | 2 +- lib/express.js | 38 ++++++++++++++++++++++++++++++++++++++ lib/service.js | 1 - package-lock.json | 5 +++++ package.json | 1 + 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 647f3ce..d919be2 100644 --- a/index.js +++ b/index.js @@ -21,7 +21,7 @@ service((err, adapter) => { // start the API server debug('starting API server') - app.use(api(adapter, {testnet: TESTNET})) + app.use(api(adapter, {testnet: TESTNET || REGTEST})) app.listen(process.env.SERVER_PORT); debug("App listening on port "+process.env.SERVER_PORT); }) diff --git a/lib/express.js b/lib/express.js index 5068321..f998458 100644 --- a/lib/express.js +++ b/lib/express.js @@ -5,6 +5,7 @@ let express = require('express') let parallel = require('run-parallel') let rpc = require('./rpc') let types = require('indexd/types') +let BN = require('bn.js') function Hex256bit (value) { return typeof value === 'string' && @@ -107,6 +108,43 @@ module.exports = function initialize (adapter, opts) { }) }) + router.get('/a/:address/balance', (req, res) => { + let scId + try { + let script = bitcoin.address.toOutputScript(req.params.address, network) + scId = bitcoin.crypto.sha256(script).toString('hex') + } catch (e) { return respond(req, res, e) } + + let height = resolveHeight(req.query.height) + + parallel({ + tip: (cb) => adapter.blockchain.db.get(types.tip, {}, cb), + utxos: (cb) => adapter.utxosByScriptId(scId, height, cb) + }, (err, results) => { + if (err) return respond(req, res, err) + + let tipHeight = results.tip.height + let balance = { + confirmed: new BN('0', 16), + unconfirmed: new BN('0', 16) + } + + Object.keys(results.utxos).forEach(function (key) { + let utxo = results.utxos[key] + let height = utxo.height + if (height && height <= tipHeight) { + balance.confirmed.iadd(new BN(utxo.value)) + } else { + balance.unconfirmed.iadd(new BN(utxo.value)) + } + }) + respond(req, res, null, { + confirmed: balance.confirmed.toString(10), + unconfirmed: balance.unconfirmed.toString(10) + }) + }) + }) + router.get('/a/:address/txs', (req, res) => { let scId try { diff --git a/lib/service.js b/lib/service.js index e7739de..cb026d0 100644 --- a/lib/service.js +++ b/lib/service.js @@ -71,4 +71,3 @@ module.exports = function initialize (callback) { callback(null, adapter) }) } - diff --git a/package-lock.json b/package-lock.json index a3e7056..43c65fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -111,6 +111,11 @@ "readable-stream": "2.3.3" } }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, "body-parser": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", diff --git a/package.json b/package.json index f20d5e0..cb98ea9 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "bitcoinjs-lib": "^3.3.1", + "bn.js": "^4.11.8", "dotenv": "^4.0.0", "express": "^4.16.2", "indexd": "=0.8.13",