From 02e71e430c0c2ca6ca5423842587c0c79c3580db Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sun, 17 Aug 2014 17:35:07 +1000 Subject: [PATCH] Wallet: revert 2f00c9a --- src/wallet.js | 96 +++++++++++++++++++++----------------------------- test/wallet.js | 15 +++++--- 2 files changed, 50 insertions(+), 61 deletions(-) diff --git a/src/wallet.js b/src/wallet.js index f3f0adf..f9b93cf 100644 --- a/src/wallet.js +++ b/src/wallet.js @@ -8,7 +8,7 @@ var HDNode = require('./hdnode') var TransactionBuilder = require('./transaction_builder') var Script = require('./script') -function Wallet(seed, network, unspents) { +function Wallet(seed, network) { seed = seed || crypto.randomBytes(32) network = network || networks.bitcoin @@ -24,7 +24,7 @@ function Wallet(seed, network, unspents) { this.addresses = [] this.changeAddresses = [] this.network = network - this.outputs = unspents ? processUnspentOutputs(unspents) : {} + this.outputs = {} // FIXME: remove in 2.x.y var me = this @@ -202,63 +202,35 @@ Wallet.prototype.getReceiveAddress = function() { } Wallet.prototype.getUnspentOutputs = function() { - var utxo = [] + var utxos = [] - for(var key in this.outputs){ + for (var key in this.outputs) { var output = this.outputs[key] // Don't include pending spent outputs if (!output.spent) { - utxo.push(outputToUnspentOutput(output)) + // hash is little-endian, we want big-endian + var txid = bufferutils.reverse(output.hash) + + utxos.push({ + hash: txid.toString('hex'), + index: output.index, + address: output.address, + value: output.value, + pending: output.pending + }) } } - return utxo + return utxos } -Wallet.prototype.setUnspentOutputs = function(utxo) { - console.warn('setUnspentOutputs is deprecated, please use the constructor option instead') +Wallet.prototype.setUnspentOutputs = function(utxos) { + utxos.forEach(function(utxo) { + var txid = utxo.hash + assert.equal(typeof txid, 'string', 'Expected txId, got ' + txid) - this.outputs = processUnspentOutputs(utxo) -} - -Wallet.prototype.signWith = function(txb, addresses) { - addresses.forEach(function(address, i) { - var privKey = this.getPrivateKeyForAddress(address) - - txb.sign(i, privKey) - }, this) - - return txb -} - -function outputToUnspentOutput(output) { - var txid = new Buffer(output.hash) - - // hash is little-endian, we want big-endian - Array.prototype.reverse.call(txid) - - return { - hash: txid.toString('hex'), - index: output.index, - address: output.address, - value: output.value, - pending: output.pending - } -} - -function estimatePaddedFee(tx, network) { - var tmpTx = tx.clone() - tmpTx.addOutput(Script.EMPTY, network.dustSoftThreshold || 0) - - return network.estimateFee(tmpTx) -} - -function processUnspentOutputs(utxos) { - var outputs = {} - - utxos.forEach(function(utxo){ - var hash = new Buffer(utxo.hash, 'hex') + var hash = bufferutils.reverse(new Buffer(txid, 'hex')) var index = utxo.index var address = utxo.address var value = utxo.value @@ -271,21 +243,33 @@ function processUnspentOutputs(utxos) { assert.doesNotThrow(function() { Address.fromBase58Check(address) }, 'Expected Base58 Address, got ' + address) assert.equal(typeof value, 'number', 'Expected number value, got ' + value) - var key = utxo.hash + ':' + utxo.index + var key = txid + ':' + index - // little-endian hash is what we use internally - Array.prototype.reverse(hash) - - outputs[key] = { + this.outputs[key] = { address: address, hash: hash, - index: utxo.index, + index: index, pending: utxo.pending, value: value } - }) + }, this) +} - return outputs +Wallet.prototype.signWith = function(tx, addresses) { + addresses.forEach(function(address, i) { + var privKey = this.getPrivateKeyForAddress(address) + + tx.sign(i, privKey) + }, this) + + return tx +} + +function estimatePaddedFee(tx, network) { + var tmpTx = tx.clone() + tmpTx.addOutput(Script.EMPTY, network.dustSoftThreshold || 0) + + return network.estimateFee(tmpTx) } function getCandidateOutputs(outputs/*, value*/) { diff --git a/test/wallet.js b/test/wallet.js index 1333926..c82c127 100644 --- a/test/wallet.js +++ b/test/wallet.js @@ -212,7 +212,8 @@ describe('Wallet', function() { describe('on construction', function() { beforeEach(function() { - wallet = new Wallet(seed, networks.bitcoin, [utxo]) + wallet = new Wallet(seed, networks.bitcoin) + wallet.setUnspentOutputs([utxo]) }) it('matches the expected behaviour', function() { @@ -229,7 +230,8 @@ describe('Wallet', function() { var utxo1 = cloneObject(utxo) utxo1.hash = fakeTxId(5) - wallet = new Wallet(seed, networks.bitcoin, [utxo, utxo1]) + wallet = new Wallet(seed, networks.bitcoin) + wallet.setUnspentOutputs([utxo, utxo1]) }) it('sums over utxo values', function() { @@ -239,7 +241,8 @@ describe('Wallet', function() { describe('getUnspentOutputs', function() { beforeEach(function() { - wallet = new Wallet(seed, networks.bitcoin, [utxo]) + wallet = new Wallet(seed, networks.bitcoin) + wallet.setUnspentOutputs([utxo]) }) it('parses wallet outputs to the expected format', function() { @@ -468,7 +471,8 @@ describe('Wallet', function() { } ] - wallet = new Wallet(seed, networks.testnet, utxos) + wallet = new Wallet(seed, networks.testnet) + wallet.setUnspentOutputs(utxos) wallet.generateAddress() wallet.generateAddress() }) @@ -497,7 +501,8 @@ describe('Wallet', function() { value: 500000 } - var wallet = new Wallet(seed, networks.litecoin, [utxo]) + var wallet = new Wallet(seed, networks.litecoin) + wallet.setUnspentOutputs([utxo]) wallet.generateAddress() value = 200000