diff --git a/js/models/wallet.js b/js/models/wallet.js index 3fb113c37..5d0ad3642 100644 --- a/js/models/wallet.js +++ b/js/models/wallet.js @@ -6,6 +6,7 @@ var Address = bitcore.Address; var Script = bitcore.Script; var coinUtil = bitcore.util; var Transaction = bitcore.Transaction; +var buffertools = bitcore.buffertools; var Storage = imports.Storage || require('./Storage'); var log = imports.log || console.log; @@ -47,7 +48,7 @@ function Wallet(opts) { Wallet.getRandomId = function () { - return coinUtil.generateNonce().toString('hex'); + return buffertools.toHex(coinUtil.generateNonce()); }; Wallet.decrypt = function (passphrase, encPayload) { @@ -265,9 +266,9 @@ Wallet.prototype.getAddresses = function() { return ret; }; -Wallet.prototype.createTx = function(utxos,outs) { +Wallet.prototype.createTx = function(utxos,outs, changeAddress) { var opts = { - remainderAddress: this.createAddress(1), + remainderAddress: changeAddress || this.createAddress(1), }; return Transaction.create(utxos, outs, opts); }; diff --git a/test/test.wallet.js b/test/test.wallet.js index 6b28b9433..22a2d04f2 100644 --- a/test/test.wallet.js +++ b/test/test.wallet.js @@ -1,33 +1,40 @@ 'use strict'; -var chai = chai || require('chai'); -var should = chai.should(); -var bitcore = bitcore || require('../node_modules/bitcore'); +var chai = chai || require('chai'); +var should = chai.should(); +var bitcore = bitcore || require('../node_modules/bitcore'); +var Address = bitcore.Address; +var buffertools = bitcore.buffertools; +var cosign = cosign || {}; +var fakeStorage = require('./FakeStorage'); +var Wallet = cosign.Wallet || require('soop').load('../js/models/Wallet', {Storage: fakeStorage}); -var cosign = cosign || {}; +var aMasterPrivKey = 'tprv8ZgxMBicQKsPdSVTiWXEqCCzqRaRr9EAQdn5UVMpT9UHX67Dh1FmzEMbavPumpAicsUm2XvC6NTdcWB89yN5DUWx5HQ7z3KByUg7Ht74VRZ'; -var Address = bitcore.Address; -var fakeStorage = require('./FakeStorage'); -var Wallet = cosign.Wallet || require('soop').load('../js/models/Wallet', {Storage: fakeStorage}); - var config = { network:'livenet', }; -var createW = function () { +var createW = function (network, bytes) { + + var config = { + network: network || 'livenet', + }; + if (bytes) config.bytes = bytes; + var w = new Wallet(config); should.exist(w); var cosigners = []; for(var i=0; i<4; i++) { + delete config['bytes']; var c = new Wallet(config); w.haveAllRequiredPubKeys().should.equal(false); w.addCosignerExtendedPubKey(c.getMasterExtendedPubKey()); cosigners.push(c); } - return {w:w, cosigners: cosigners}; }; @@ -142,6 +149,48 @@ describe('Wallet model', function() { } }); + + it('should create a TX', function () { + var k = createW('testnet', aMasterPrivKey); + var w = k.w; + var as=[], j=0; + for(var isChange=0; isChange<2; isChange++) + for(var i=0; i<6; i++) + as[j++] = w.createAddress(isChange); + + var utxos = [ + { + address: as[0], + txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", + scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac", + vout: 1, + amount: 1, + confirmations: 3 + }, + { + address: as[1], + txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", + scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac", + vout: 1, + amount: 1.01, + confirmations: 7 + }, + ]; + + + var outs=[{ + address: 'mfwSGKeLEGdd1YwsZ1TkoEeKNk8TTWqXLC', + amount: 1.5, + }]; + var ret = w.createTx(utxos, outs, '2Mu1GwdF9X1LLxXNxtfNChi5ngBMJxi2csv'); + var tx=ret.tx; + should.exist(tx); + tx.ins.length.should.equal(2); + tx.outs.length.should.equal(2); + buffertools.toHex(tx.serialize()).should.equal('0100000002c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffffc1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffff0280d1f008000000001976a91404a154d56e5455dc87f15e293b8872f31d03a12c88acb00b0a030000000017a914134ce4e4ea92b6cb0008803cafe25f197ff1dcb98700000000'); + + }); + });