From c955498f4dd09119864b0e93389c0df0136c9611 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 30 Apr 2015 00:35:20 -0300 Subject: [PATCH 1/4] fixing /v1/addresses --- api/controllers/addresses.js | 2 +- api/test/v1/addresses.js | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/api/controllers/addresses.js b/api/controllers/addresses.js index 7e58264f..ed1aefc8 100644 --- a/api/controllers/addresses.js +++ b/api/controllers/addresses.js @@ -63,7 +63,7 @@ Addresses.addressesParam = function(req, res, next, addresses) { */ Addresses.get = function(req, res) { $.checkState(req.address instanceof Address); - node.getAddressInfo(req.address) + node.addressService.getSummary(req.address) .then(function(info) { res.send(info); }); diff --git a/api/test/v1/addresses.js b/api/test/v1/addresses.js index ae2793f1..6eaf5376 100644 --- a/api/test/v1/addresses.js +++ b/api/test/v1/addresses.js @@ -2,7 +2,6 @@ var chai = require('chai'); var should = chai.should(); -var request = require('supertest'); var EventEmitter = require('eventemitter2').EventEmitter2; var Promise = require('bluebird'); @@ -10,16 +9,15 @@ Promise.longStackTraces(); var bitcore = require('bitcore'); var _ = bitcore.deps._; -var BitcoreHTTP = require('../../lib/http'); var mockAddresses = require('../data/addresses'); var mockTransactions = require('../data/transactions'); -describe('BitcoreHTTP v1 addresses routes', function() { +describe.only('BitcoreHTTP v1 addresses routes', function() { // mocks var transactionList = _.values(mockTransactions); - var nodeMock, app, agent; + var nodeMock, agent; var txs_for_addr = function(addr) { var amount = mockAddresses[addr].summary.transactions.length; return transactionList.slice(0, amount); @@ -51,7 +49,8 @@ describe('BitcoreHTTP v1 addresses routes', function() { beforeEach(function() { nodeMock = new EventEmitter(); - nodeMock.getAddressInfo = function(address) { + nodeMock.addressService = {}; + nodeMock.addressService.getSummary = function(address) { return Promise.resolve(mockAddresses[address.toString()]); }; nodeMock.listTransactions = function(opts) { @@ -60,8 +59,7 @@ describe('BitcoreHTTP v1 addresses routes', function() { nodeMock.getUTXOs = function(addresses) { return Promise.resolve(utxos_for_addrs(addresses)); }; - app = new BitcoreHTTP(nodeMock).app; - agent = request(app); + agent = require('../app')(nodeMock); }); var failsWithInvalidAddress = function(agent, url, cb) { From 20fec9d17b2d8ea130db03cb13f5e4dfcdf83b0e Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 30 Apr 2015 01:36:14 -0300 Subject: [PATCH 2/4] fixing outgoing balances --- lib/node.js | 9 ++++++++- lib/services/transaction.js | 16 +++++++--------- package.json | 1 - 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/node.js b/lib/node.js index 4ebcb503..0d7ac927 100644 --- a/lib/node.js +++ b/lib/node.js @@ -188,10 +188,17 @@ BitcoreNode.prototype.getStatus = function() { peerCount: this.networkMonitor.getConnectedPeers(), version: pjson.version, network: bitcore.Networks.defaultNetwork.name, - height: this.blockchain.getCurrentHeight(), + height: this.getCurrentHeight(), }); }; +BitcoreNode.prototype.getCurrentHeight = function() { + if (!this.blockchain) { + return 0; + } + return this.blockchain.getCurrentHeight(); +}; + BitcoreNode.prototype.getSyncProgress = function() { return !_.isUndefined(this.reportedMaxHeight) ? (this.blockchain.getCurrentHeight() / this.reportedMaxHeight) : 0; diff --git a/lib/services/transaction.js b/lib/services/transaction.js index d042a28c..01cf5730 100644 --- a/lib/services/transaction.js +++ b/lib/services/transaction.js @@ -140,9 +140,12 @@ TransactionService.prototype._confirmInput = function(ops, block, transaction) { var self = this; var txid = transaction.id; return function(input, index) { - if (input.prevTxId.toString('hex') === NULLTXHASH) { + if (input.isNull()) { return Promise.resolve(); } + if (input.script.isPublicKeyHashIn()) { + console.log(input.toObject()); + } ops.push({ type: 'put', key: Index.getOutput(txid, index), @@ -151,12 +154,13 @@ TransactionService.prototype._confirmInput = function(ops, block, transaction) { })) }); var script = input.script; - if (!(script.isPublicKeyHashIn() || script.isPublicKeyIn() || script.isScriptHashIn())) { + if (!(script.isPublicKeyHashIn() || script.isScriptHashIn())) { return; } return Promise.try(function() { - var address = self._getAddressForInput(input); + var address = input.script.toAddress(); + console.log('input address!', address.toString()); if (address) { ops.push({ type: 'put', @@ -173,12 +177,6 @@ TransactionService.prototype._confirmInput = function(ops, block, transaction) { }; }; -TransactionService.prototype._getAddressForInput = function(input) { - var script = input.script; - // TODO: move this to bitcore - return new bitcore.Script(script.chunks[script.chunks.length - 1]).toAddress(); -}; - TransactionService.prototype._confirmTransaction = function(ops, block, transaction) { var self = this; ops.push({ diff --git a/package.json b/package.json index cd14a3c0..e6b75fd4 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,6 @@ "bluebird": "^2.9.12", "body-parser": "^1.12.0", "bufferput": "bitpay/node-bufferput", - "buffertools": "*", "compression": "^1.4.1", "config": "^1.12.0", "cors": "^2.5.3", From fc720410ac271dbb9447c62ed4745297d2290533 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 30 Apr 2015 04:57:43 -0300 Subject: [PATCH 3/4] polish /v1/addresses --- api/test/data/addresses.js | 61 +++++++++++++++++++++++++++++++++++++ api/test/v1/addresses.js | 4 +-- api/test/v1/node.js | 2 +- lib/services/transaction.js | 54 +++++++++++++++----------------- 4 files changed, 88 insertions(+), 33 deletions(-) diff --git a/api/test/data/addresses.js b/api/test/data/addresses.js index bed32ae6..9a6c1a09 100644 --- a/api/test/data/addresses.js +++ b/api/test/data/addresses.js @@ -1,6 +1,67 @@ 'use strict'; var mockAddresses = { + '13fas9TWPMRBakZ822mvddS6PM92udNB2g': { + summary: { + address: '13fas9TWPMRBakZ822mvddS6PM92udNB2g', + transactions: [ + '4469092947a437f9b4276e0a7e3c899a2b74b2fe325e49202c3005911adaab85', + 'afa55c2ce0e1038d87921d4de7b13a456edfa5ca6f44cddaf4cda9f1db441481' + ], + confirmed: { + balance: 0, + sent: 675000000, + received: 675000000 + }, + unconfirmed: { + balance: 0, + sent: 675000000, + received: 675000000 + } + }, + utxos: [] + }, + '17afxUJouat3fkaaQ9tZrDThxdkXGL4WrM': { + summary: { + address: '17afxUJouat3fkaaQ9tZrDThxdkXGL4WrM', + transactions: [ + '2ccc3f59d28c709770a8bc478b112e10feda4bf55197c2e48deaa0eb6bca0311', + '92f55c2c0b8317eafad83c73487fbeceb8279d0eb57e398763298e6cc983b356' + ], + confirmed: { + balance: 0, + sent: 100000000000, + received: 100000000000 + }, + unconfirmed: { + balance: 0, + sent: 100000000000, + received: 100000000000 + } + }, + utxos: [] + }, + '17DC6Fxidja2DN7oHTVgfx3uQ4KGArYEwg': { + summary: { + 'address': '17DC6Fxidja2DN7oHTVgfx3uQ4KGArYEwg', + 'transactions': [ + '33d1ad0d24e2cb466054e47060c8ae527af7a3c46445335bebf9d24a6f5b1e9e', + '6884733345b952b244a44cf770be62afbcf41549d8a89d2a4bea9f479e09dd47', + '2847ae66175042438532c2eccc5b39935fd1216453e62e2c3cb9c8e5020cc771' + ], + 'confirmed': { + 'balance': 0, + 'sent': 65000000000, + 'received': 65000000000 + }, + 'unconfirmed': { + 'balance': 0, + 'sent': 65000000000, + 'received': 65000000000 + } + }, + utxos: [] + }, '1CT9huFgxMFveRvzZ7zPPJNoaMm2Fo64VH': { summary: { address: '1CT9huFgxMFveRvzZ7zPPJNoaMm2Fo64VH', diff --git a/api/test/v1/addresses.js b/api/test/v1/addresses.js index 6eaf5376..51438776 100644 --- a/api/test/v1/addresses.js +++ b/api/test/v1/addresses.js @@ -51,7 +51,7 @@ describe.only('BitcoreHTTP v1 addresses routes', function() { nodeMock = new EventEmitter(); nodeMock.addressService = {}; nodeMock.addressService.getSummary = function(address) { - return Promise.resolve(mockAddresses[address.toString()]); + return Promise.resolve(mockAddresses[address.toString()].summary); }; nodeMock.listTransactions = function(opts) { return Promise.resolve(txs_for_addr(opts.address)); @@ -77,7 +77,7 @@ describe.only('BitcoreHTTP v1 addresses routes', function() { it('works with valid address ' + addr, function(cb) { agent.get('/v1/addresses/' + addr) .expect(200) - .expect(JSON.stringify(info), cb); + .expect(JSON.stringify(info.summary), cb); }); }); }); diff --git a/api/test/v1/node.js b/api/test/v1/node.js index cf0e59f8..63d12a90 100644 --- a/api/test/v1/node.js +++ b/api/test/v1/node.js @@ -18,7 +18,7 @@ describe('BitcoreHTTP v1 node routes', function() { peerCount: 8, version: 'test', network: 'regtest', - height: 1234, + height: 60000, }; nodeMock.getStatus = function() { return Promise.resolve(nodeMock.status); diff --git a/lib/services/transaction.js b/lib/services/transaction.js index 01cf5730..7f581db4 100644 --- a/lib/services/transaction.js +++ b/lib/services/transaction.js @@ -120,32 +120,28 @@ TransactionService.prototype._confirmOutput = function(ops, block, transaction) key: Index.getOutput(txid, index), value: output.toJSON() }); - var address; - if (output.script.isPublicKeyHashOut() || output.script.isScriptHashOut()) { - address = output.script.toAddress(); - } - if (address) { - var out4addr = output.toObject(); - out4addr.heightConfirmed = block.height; - ops.push({ - type: 'put', - key: Index.getOutputsForAddress(address, txid, index), - value: JSON.stringify(out4addr) - }); + var script = output.script; + if (!script.isPublicKeyHashOut() && !script.isScriptHashOut()) { + return; } + var address = output.script.toAddress(); + //console.log('o', address.type, address.toString()); + var obj = output.toObject(); + obj.heightConfirmed = block.height; + ops.push({ + type: 'put', + key: Index.getOutputsForAddress(address, txid, index), + value: JSON.stringify(obj) + }); }; }; TransactionService.prototype._confirmInput = function(ops, block, transaction) { - var self = this; var txid = transaction.id; return function(input, index) { if (input.isNull()) { return Promise.resolve(); } - if (input.script.isPublicKeyHashIn()) { - console.log(input.toObject()); - } ops.push({ type: 'put', key: Index.getOutput(txid, index), @@ -155,24 +151,22 @@ TransactionService.prototype._confirmInput = function(ops, block, transaction) { }); var script = input.script; if (!(script.isPublicKeyHashIn() || script.isScriptHashIn())) { - return; + return Promise.resolve(); } return Promise.try(function() { var address = input.script.toAddress(); - console.log('input address!', address.toString()); - if (address) { - ops.push({ - type: 'put', - key: Index.getSpentOutputsForAddress(address, txid, index), - value: JSON.stringify({ - heightSpent: block.height, - spentTx: txid, - spentTxInputIndex: index, - spendInput: input.toObject() - }) - }); - } + //console.log('i', address.type, address.toString()); + ops.push({ + type: 'put', + key: Index.getSpentOutputsForAddress(address, txid, index), + value: JSON.stringify({ + heightSpent: block.height, + spentTx: txid, + spentTxInputIndex: index, + spendInput: input.toObject() + }) + }); }); }; }; From e1f0051c0f60c4e002eddc4f8d23a1d94fd6f428 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Thu, 30 Apr 2015 04:58:39 -0300 Subject: [PATCH 4/4] remove only --- api/test/v1/addresses.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/test/v1/addresses.js b/api/test/v1/addresses.js index 51438776..341a41f4 100644 --- a/api/test/v1/addresses.js +++ b/api/test/v1/addresses.js @@ -13,7 +13,7 @@ var _ = bitcore.deps._; var mockAddresses = require('../data/addresses'); var mockTransactions = require('../data/transactions'); -describe.only('BitcoreHTTP v1 addresses routes', function() { +describe('BitcoreHTTP v1 addresses routes', function() { // mocks var transactionList = _.values(mockTransactions);