|
|
@ -34,18 +34,18 @@ describe('Transaction', function() { |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should be able to select utxos', function() { |
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,1.0); |
|
|
|
it('#_selectUnspent should be able to select utxos', function() { |
|
|
|
var u = Transaction._selectUnspent(testdata.dataUnspends,1.0); |
|
|
|
u.length.should.equal(3); |
|
|
|
u = Transaction.selectUnspent(testdata.dataUnspends,0.5); |
|
|
|
u = Transaction._selectUnspent(testdata.dataUnspends,0.5); |
|
|
|
u.length.should.equal(3); |
|
|
|
u = Transaction.selectUnspent(testdata.dataUnspends,0.1); |
|
|
|
u = Transaction._selectUnspent(testdata.dataUnspends,0.1); |
|
|
|
u.length.should.equal(2); |
|
|
|
u = Transaction.selectUnspent(testdata.dataUnspends,0.05); |
|
|
|
u = Transaction._selectUnspent(testdata.dataUnspends,0.05); |
|
|
|
u.length.should.equal(2); |
|
|
|
u = Transaction.selectUnspent(testdata.dataUnspends,0.015); |
|
|
|
u = Transaction._selectUnspent(testdata.dataUnspends,0.015); |
|
|
|
u.length.should.equal(2); |
|
|
|
u = Transaction.selectUnspent(testdata.dataUnspends,0.01); |
|
|
|
u = Transaction._selectUnspent(testdata.dataUnspends,0.01); |
|
|
|
u.length.should.equal(1); |
|
|
|
should.exist(u[0].amount); |
|
|
|
should.exist(u[0].txid); |
|
|
@ -53,25 +53,63 @@ describe('Transaction', function() { |
|
|
|
should.exist(u[0].vout); |
|
|
|
}); |
|
|
|
|
|
|
|
it('should return null if not enough utxos', function() { |
|
|
|
it('#selectUnspent should return null if not enough utxos', function() { |
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,1.12); |
|
|
|
u.length.should.equal(0); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('should be able to create instance thru #create', function() { |
|
|
|
it('#selectUnspent should check confirmations', function() { |
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,0.9); |
|
|
|
u.length.should.equal(0); |
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,0.9,true); |
|
|
|
u.length.should.equal(3); |
|
|
|
|
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,0.11); |
|
|
|
u.length.should.equal(2); |
|
|
|
var u = Transaction.selectUnspent(testdata.dataUnspends,0.111); |
|
|
|
u.length.should.equal(0); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
var opts = {remainderAddress: 'mwZabyZXg8JzUtFX1pkGygsMJjnuqiNhgd'}; |
|
|
|
it('#create should be able to create instance', function() { |
|
|
|
var utxos = Transaction.selectUnspent(testdata.dataUnspends,0.1); |
|
|
|
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}]; |
|
|
|
var tx = Transaction.create(utxos, outs, |
|
|
|
{remainderAddress:'3CMNFxN1oHBc4R1EpboAL5yzHGgE611Xou'}); |
|
|
|
var tx = Transaction.create(utxos, outs, opts); |
|
|
|
should.exist(tx); |
|
|
|
|
|
|
|
tx.version.should.equal(1); |
|
|
|
tx.ins.length.should.equal(2); |
|
|
|
tx.outs.length.should.equal(2); |
|
|
|
util.valueToBigInt(tx.outs[0].v).cmp(8000000).should.equal(0); |
|
|
|
// TODO remainder is 0.03 here because unspend just select utxos in order
|
|
|
|
util.valueToBigInt(tx.outs[1].v).cmp(3000000).should.equal(0); |
|
|
|
// remainder is 0.0299 here because unspend select utxos in order
|
|
|
|
util.valueToBigInt(tx.outs[1].v).cmp(2990000).should.equal(0); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('#create should fail if not enough inputs ', function() { |
|
|
|
var utxos = Transaction.selectUnspent(testdata.dataUnspends,1); |
|
|
|
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}]; |
|
|
|
Transaction |
|
|
|
.create |
|
|
|
.bind(utxos, outs, opts) |
|
|
|
.should.throw(); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
it('#create should create same output as bitcoind createrawtransaction ', function() { |
|
|
|
var utxos = Transaction.selectUnspent(testdata.dataUnspends,0.1); |
|
|
|
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}]; |
|
|
|
var tx = Transaction.create(utxos, outs, opts); |
|
|
|
tx.serialize().toString('hex').should.equal('0100000002c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffffc2cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0000000000ffffffff0200127a00000000001976a914774e603bafb717bd3f070e68bbcccfd907c77d1388acb09f2d00000000001976a914b00127584485a7cff0949ef0f6bc5575f06ce00d88ac00000000'); |
|
|
|
|
|
|
|
outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}]; |
|
|
|
tx = Transaction.create(utxos, outs, {fee:0.03} ); |
|
|
|
tx.serialize().toString('hex').should.equal('0100000002c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffffc2cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0000000000ffffffff0100127a00000000001976a914774e603bafb717bd3f070e68bbcccfd907c77d1388ac00000000'); |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// Read tests from test/data/tx_valid.json
|
|
|
|
// Format is an array of arrays
|
|
|
|