From cc0277d94e3e36ef4e06c3ca8419983e15a35a67 Mon Sep 17 00:00:00 2001 From: ajv Date: Sat, 21 May 2016 16:57:27 -0700 Subject: [PATCH 1/4] multi address info --- README.md | 34 ++++++++++++++++++++++++++ lib/addresses.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/index.js | 10 ++++++++ 3 files changed, 107 insertions(+) diff --git a/README.md b/README.md index 761fe390c..1150f5d87 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,40 @@ which is the hash of the Genesis block (0 height) ``` The response contains the value in Satoshis. +### Multiple Addresss +GET method: +``` +/insight-api/addrs/[:addrs] +/insight-api/addrs/2NF2baYuJAkCKo5onjUKEPdARQkZ6SYyKd5,2NAre8sX2povnjy4aeiHKeEh97Qhn97tB1f +``` + +POST method: +``` +/insight-api/addrs/[:addrs] +``` + +POST params: +``` +addrs: 2NF2baYuJAkCKo5onjUKEPdARQkZ6SYyKd5,2NAre8sX2povnjy4aeiHKeEh97Qhn97tB1f +``` + +### Address Properties for Multiple Addresses +GET method: +``` +/insight-api/addrs/[:addrs]/balance +/insight-api/addrs/[:addrs]/totalReceived +/insight-api/addrs/[:addrs]/totalSent +/insight-api/addrs/[:addrs]/unconfirmedBalance +``` + +POST method: +``` +/insight-api/addrs/balance +/insight-api/addrs/totalReceived +/insight-api/addrs/totalSent +/insight-api/addrs/unconfirmedBalance +``` + ### Unspent Outputs ``` /insight-api/addr/[:addr]/utxo[?noCache=1] diff --git a/lib/addresses.js b/lib/addresses.js index 765faab84..9e8116f08 100644 --- a/lib/addresses.js +++ b/lib/addresses.js @@ -77,6 +77,69 @@ AddressController.prototype.getAddressSummary = function(address, options, callb }); }; +AddressController.prototype.multishow = function(req, res) { + var self = this; + + var options = { + noTxList: parseInt(req.query.noTxList) + }; + + if(req.body.addrs) { + req.addrs = req.body.addrs.split(','); + } else { + req.addrs = req.params.addrs.split(','); + } + + async.map(req.addrs, function(address, callback) { + self.getAddressSummary(address, options, function(err, data) { + if (err) return callback(err); + callback(null, data); + }); + }, function(err, results) { + if (err) return common.handleErrors(err, res); + res.jsonp(results); + }); +}; + +AddressController.prototype.multiBalance = function(req, res) { + this.multiAddressSummarySubQuery(req, res, 'balanceSat'); +}; + +AddressController.prototype.multiTotalReceived = function(req, res) { + this.multiAddressSummarySubQuery(req, res, 'totalReceivedSat'); +}; + +AddressController.prototype.multiTotalSent = function(req, res) { + this.multiAddressSummarySubQuery(req, res, 'totalSentSat'); +}; + +AddressController.prototype.multiUnconfirmedBalance = function(req, res) { + this.multiAddressSummarySubQuery(req, res, 'unconfirmedBalanceSat'); +}; + +AddressController.prototype.multiAddressSummarySubQuery = function(req, res, param) { + var self = this; + + if(req.body.addrs) { + req.addrs = req.body.addrs.split(','); + } else { + req.addrs = req.params.addrs.split(','); + } + + async.map(req.addrs, function(address, callback) { + self.getAddressSummary(address, { noTxList: 1 }, function(err, data) { + if (err) return callback(err); + + var ret = { addrStr: address } + ret[param] = data[param]; + callback(null, ret); + }); + }, function(err, results) { + if (err) return common.handleErrors(err, res); + res.jsonp(results); + }); +}; + AddressController.prototype.checkAddr = function(req, res, next) { req.addr = req.params.addr; this.check(req, res, next, [req.addr]); diff --git a/lib/index.js b/lib/index.js index e477b3f61..b9aae74a9 100644 --- a/lib/index.js +++ b/lib/index.js @@ -122,6 +122,8 @@ InsightAPI.prototype.setupRoutes = function(app) { var addresses = new AddressController(this.node); app.get('/addr/:addr', this.cacheShort(), addresses.checkAddr.bind(addresses), addresses.show.bind(addresses)); app.get('/addr/:addr/utxo', this.cacheShort(), addresses.checkAddr.bind(addresses), addresses.utxo.bind(addresses)); + app.get('/addrs/:addrs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multishow.bind(addresses)); + app.post('/addrs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multishow.bind(addresses)); app.get('/addrs/:addrs/utxo', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiutxo.bind(addresses)); app.post('/addrs/utxo', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiutxo.bind(addresses)); app.get('/addrs/:addrs/txs', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multitxs.bind(addresses)); @@ -132,6 +134,14 @@ InsightAPI.prototype.setupRoutes = function(app) { app.get('/addr/:addr/totalReceived', this.cacheShort(), addresses.checkAddr.bind(addresses), addresses.totalReceived.bind(addresses)); app.get('/addr/:addr/totalSent', this.cacheShort(), addresses.checkAddr.bind(addresses), addresses.totalSent.bind(addresses)); app.get('/addr/:addr/unconfirmedBalance', this.cacheShort(), addresses.checkAddr.bind(addresses), addresses.unconfirmedBalance.bind(addresses)); + app.get('/addrs/:addrs/balance', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiBalance.bind(addresses)); + app.post('/addrs/balance', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiBalance.bind(addresses)); + app.get('/addrs/:addrs/totalReceived', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiTotalReceived.bind(addresses)); + app.post('/addrs/totalReceived', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiTotalReceived.bind(addresses)); + app.get('/addrs/:addrs/totalSent', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiTotalSent.bind(addresses)); + app.post('/addrs/totalSent', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiTotalSent.bind(addresses)); + app.get('/addrs/:addrs/unconfirmedBalance', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiUnconfirmedBalance.bind(addresses)); + app.post('/addrs/unconfirmedBalance', this.cacheShort(), addresses.checkAddrs.bind(addresses), addresses.multiUnconfirmedBalance.bind(addresses)); // Status route var status = new StatusController(this.node); From 8134e54c1957903a7495252edbf1f862969c4bd9 Mon Sep 17 00:00:00 2001 From: ajv Date: Thu, 26 May 2016 10:58:15 -0700 Subject: [PATCH 2/4] add amountSat field to utxo endpoint --- lib/addresses.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/addresses.js b/lib/addresses.js index 9e8116f08..a23d1176a 100644 --- a/lib/addresses.js +++ b/lib/addresses.js @@ -212,6 +212,7 @@ AddressController.prototype.transformUtxo = function(utxo) { vout: utxo.outputIndex, ts: utxo.timestamp ? parseInt(utxo.timestamp) : Date.now(), scriptPubKey: utxo.script, + amountSat: utxo.satoshis, amount: utxo.satoshis / 1e8, confirmations: utxo.confirmations }; From 8fbf736580352ad51cf573503f43d35aae9474a1 Mon Sep 17 00:00:00 2001 From: ajv Date: Thu, 26 May 2016 14:54:09 -0700 Subject: [PATCH 3/4] update tests for amountSat --- test/addresses.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/addresses.js b/test/addresses.js index 03e6c5953..013eec257 100644 --- a/test/addresses.js +++ b/test/addresses.js @@ -283,6 +283,7 @@ describe('Addresses', function() { "vout": 1, "ts": 1441116143, "scriptPubKey": "76a914d2ec20bb8e5f25a52f730384b803d95683250e0b88ac", + "amountSat": 53320000, "amount": 0.5332, "confirmations": 50, "confirmationsFromCache": true @@ -326,6 +327,7 @@ describe('Addresses', function() { "vout": 1, "ts": 1441116143, "scriptPubKey": "76a914d2ec20bb8e5f25a52f730384b803d95683250e0b88ac", + "amountSat": 53320000, "amount": 0.5332, "confirmations": 50, "confirmationsFromCache": true @@ -336,6 +338,7 @@ describe('Addresses', function() { "vout": 2, "ts": 1441116143, "scriptPubKey": "76a914583df9fa56ad961051e00ca93e68dfaf1eab9ec588ac", + "amountSat": 289829, "amount": 0.00289829, "confirmations": 50, "confirmationsFromCache": true From 3390e7b5db9ddded7c817194606a1169606484e4 Mon Sep 17 00:00:00 2001 From: ajv Date: Thu, 26 May 2016 15:14:02 -0700 Subject: [PATCH 4/4] change amountSat to satoshis to match insight.bitpay.com/api --- lib/addresses.js | 2 +- test/addresses.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/addresses.js b/lib/addresses.js index a23d1176a..712ebff89 100644 --- a/lib/addresses.js +++ b/lib/addresses.js @@ -212,8 +212,8 @@ AddressController.prototype.transformUtxo = function(utxo) { vout: utxo.outputIndex, ts: utxo.timestamp ? parseInt(utxo.timestamp) : Date.now(), scriptPubKey: utxo.script, - amountSat: utxo.satoshis, amount: utxo.satoshis / 1e8, + satoshis: utxo.satoshis, confirmations: utxo.confirmations }; }; diff --git a/test/addresses.js b/test/addresses.js index 013eec257..44e17eb6f 100644 --- a/test/addresses.js +++ b/test/addresses.js @@ -283,8 +283,8 @@ describe('Addresses', function() { "vout": 1, "ts": 1441116143, "scriptPubKey": "76a914d2ec20bb8e5f25a52f730384b803d95683250e0b88ac", - "amountSat": 53320000, "amount": 0.5332, + "satoshis": 53320000, "confirmations": 50, "confirmationsFromCache": true } @@ -327,8 +327,8 @@ describe('Addresses', function() { "vout": 1, "ts": 1441116143, "scriptPubKey": "76a914d2ec20bb8e5f25a52f730384b803d95683250e0b88ac", - "amountSat": 53320000, "amount": 0.5332, + "satoshis": 53320000, "confirmations": 50, "confirmationsFromCache": true }, @@ -338,8 +338,8 @@ describe('Addresses', function() { "vout": 2, "ts": 1441116143, "scriptPubKey": "76a914583df9fa56ad961051e00ca93e68dfaf1eab9ec588ac", - "amountSat": 289829, "amount": 0.00289829, + "satoshis": 289829, "confirmations": 50, "confirmationsFromCache": true }