Browse Source

wallet: processTx -> processConfirmedTx, processPendingTx

hk-custom-address
Wei Lu 11 years ago
parent
commit
d265b53b03
  1. 10
      src/wallet.js
  2. 141
      test/wallet.js

10
src/wallet.js

@ -137,7 +137,15 @@ function Wallet(seed, network) {
return value == undefined return value == undefined
} }
this.processTx = function(tx, isPending) { this.processPendingTx = function(tx){
processTx(tx, true)
}
this.processConfirmedTx = function(tx){
processTx(tx, false)
}
function processTx(tx, isPending) {
var txhash = tx.getHash() var txhash = tx.getHash()
tx.outs.forEach(function(txOut, i){ tx.outs.forEach(function(txOut, i){

141
test/wallet.js

@ -252,7 +252,7 @@ describe('Wallet', function() {
}) })
}) })
describe('processTx', function(){ describe('Process transaction', function(){
var addresses var addresses
var tx var tx
@ -266,100 +266,105 @@ describe('Wallet', function() {
tx = Transaction.fromHex(fixtureTx1Hex) tx = Transaction.fromHex(fixtureTx1Hex)
}) })
it('does not fail on scripts with no corresponding Address', function() { describe("processPendingTx", function(){
var pubKey = wallet.getPrivateKey(0).pub it("sets the pending flag on output", function(){
var script = Script.createPubKeyScriptPubKey(pubKey) wallet.addresses = [addresses[0]]
var tx2 = new Transaction() wallet.processPendingTx(tx)
tx2.addInput(fakeTxHash(1), 0)
// FIXME: Transaction doesn't support custom ScriptPubKeys... yet
// So for now, we hijack the script with our own, and undefine the cached address
tx2.addOutput(addresses[0], 10000)
tx2.outs[0].script = script
tx2.outs[0].address = undefined
wallet.processTx(tx2) verifyOutputAdded(0, true)
})
}) })
describe("when tx outs contains an address owned by the wallet, an 'output' gets added to wallet.outputs", function(){ describe('processConfirmedTx', function(){
it("works for receive address", function(){
var totalOuts = outputCount()
wallet.addresses = [addresses[0]] it('does not fail on scripts with no corresponding Address', function() {
wallet.processTx(tx) var pubKey = wallet.getPrivateKey(0).pub
var script = Script.createPubKeyScriptPubKey(pubKey)
var tx2 = new Transaction()
tx2.addInput(fakeTxHash(1), 0)
assert.equal(outputCount(), totalOuts + 1) // FIXME: Transaction doesn't support custom ScriptPubKeys... yet
verifyOutputAdded(0) // So for now, we hijack the script with our own, and undefine the cached address
tx2.addOutput(addresses[0], 10000)
tx2.outs[0].script = script
tx2.outs[0].address = undefined
wallet.processConfirmedTx(tx2)
}) })
it("works for change address", function(){ describe("when tx outs contains an address owned by the wallet, an 'output' gets added to wallet.outputs", function(){
var totalOuts = outputCount() it("works for receive address", function(){
wallet.changeAddresses = [addresses[1]] var totalOuts = outputCount()
wallet.processTx(tx) wallet.addresses = [addresses[0]]
wallet.processConfirmedTx(tx)
assert.equal(outputCount(), totalOuts + 1) assert.equal(outputCount(), totalOuts + 1)
verifyOutputAdded(1) verifyOutputAdded(0, false)
}) })
describe("when the pending flag is set", function(){ it("works for change address", function(){
it("sets the pending flag on output", function(){ var totalOuts = outputCount()
wallet.addresses = [addresses[0]] wallet.changeAddresses = [addresses[1]]
wallet.processTx(tx, true)
wallet.processConfirmedTx(tx)
verifyOutputAdded(0, true) assert.equal(outputCount(), totalOuts + 1)
verifyOutputAdded(1, false)
}) })
function outputCount(){
return Object.keys(wallet.outputs).length
}
}) })
function outputCount(){ describe("when tx ins outpoint contains a known txhash:i, the corresponding 'output' gets updated", function(){
return Object.keys(wallet.outputs).length beforeEach(function(){
} wallet.addresses = [addresses[0]] // the address fixtureTx2 used as input
wallet.processConfirmedTx(tx)
function verifyOutputAdded(index, pending) { tx = Transaction.fromHex(fixtureTx2Hex)
var txOut = tx.outs[index] })
var key = tx.getHash() + ":" + index
var output = wallet.outputs[key]
assert.equal(output.receive, key)
assert.equal(output.value, txOut.value)
assert.equal(output.pending, pending)
var txOutAddress = Address.fromScriptPubKey(txOut.script).toString() it("does not add to wallet.outputs", function(){
assert.equal(output.address, txOutAddress) var outputs = wallet.outputs
} wallet.processConfirmedTx(tx)
}) assert.deepEqual(wallet.outputs, outputs)
})
describe("when tx ins outpoint contains a known txhash:i, the corresponding 'output' gets updated", function(){ it("sets spend with the transaction hash and input index", function(){
beforeEach(function(){ wallet.processConfirmedTx(tx)
wallet.addresses = [addresses[0]] // the address fixtureTx2 used as input
wallet.processTx(tx)
tx = Transaction.fromHex(fixtureTx2Hex) var txIn = tx.ins[0]
var key = txIn.outpoint.hash + ":" + txIn.outpoint.index
var output = wallet.outputs[key]
assert.equal(output.spend, tx.getHash() + ':' + 0)
})
}) })
it("does not add to wallet.outputs", function(){ it("does nothing when none of the involved addresses belong to the wallet", function(){
var outputs = wallet.outputs var outputs = wallet.outputs
wallet.processTx(tx) wallet.processConfirmedTx(tx)
assert.deepEqual(wallet.outputs, outputs) assert.deepEqual(wallet.outputs, outputs)
}) })
it("sets spend with the transaction hash and input index", function(){
wallet.processTx(tx)
var txIn = tx.ins[0]
var key = txIn.outpoint.hash + ":" + txIn.outpoint.index
var output = wallet.outputs[key]
assert.equal(output.spend, tx.getHash() + ':' + 0)
})
}) })
it("does nothing when none of the involved addresses belong to the wallet", function(){ function verifyOutputAdded(index, pending) {
var outputs = wallet.outputs var txOut = tx.outs[index]
wallet.processTx(tx) var key = tx.getHash() + ":" + index
assert.deepEqual(wallet.outputs, outputs) var output = wallet.outputs[key]
}) assert.equal(output.receive, key)
assert.equal(output.value, txOut.value)
assert.equal(output.pending, pending)
var txOutAddress = Address.fromScriptPubKey(txOut.script).toString()
assert.equal(output.address, txOutAddress)
}
}) })
describe('createTx', function(){ describe('createTx', function(){
var to, value var to, value
var address1, address2 var address1, address2

Loading…
Cancel
Save