bitcore/test/test.Transaction.js

198 lines
7.9 KiB
JavaScript
Raw Normal View History

2014-02-06 07:57:47 -08:00
'use strict';
var chai = chai || require('chai');
var bitcore = bitcore || require('../bitcore');
2014-02-06 07:57:47 -08:00
var should = chai.should();
var TransactionModule = bitcore.Transaction;
var Transaction;
2014-02-27 13:09:02 -08:00
var In;
var Out;
var Script = bitcore.Script;
2014-03-14 23:27:06 -07:00
var util = bitcore.util;
2014-02-27 13:09:02 -08:00
var buffertools = require('buffertools');
2014-03-10 09:44:22 -07:00
var testdata = testdata || require('./testdata');
2014-02-06 07:57:47 -08:00
2014-02-18 06:39:47 -08:00
describe('Transaction', function() {
2014-02-06 07:57:47 -08:00
it('should initialze the main object', function() {
should.exist(TransactionModule);
});
it('should be able to create class', function() {
Transaction = TransactionModule;
2014-02-06 07:57:47 -08:00
should.exist(Transaction);
2014-02-27 13:09:02 -08:00
In = Transaction.In;
Out = Transaction.Out;
should.exist(In);
should.exist(Out);
2014-02-06 07:57:47 -08:00
});
2014-03-14 13:38:42 -07:00
2014-02-06 07:57:47 -08:00
it('should be able to create instance', function() {
var t = new Transaction();
should.exist(t);
});
2014-03-14 13:38:42 -07:00
it('#selectUnspent should be able to select utxos', function() {
var u = Transaction.selectUnspent(testdata.dataUnspent,1.0, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(3);
should.exist(u[0].amount);
should.exist(u[0].txid);
should.exist(u[0].scriptPubKey);
should.exist(u[0].vout);
u = Transaction.selectUnspent(testdata.dataUnspent,0.5, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(3);
u = Transaction.selectUnspent(testdata.dataUnspent,0.1, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(2);
u = Transaction.selectUnspent(testdata.dataUnspent,0.05, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(2);
u = Transaction.selectUnspent(testdata.dataUnspent,0.015, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(2);
u = Transaction.selectUnspent(testdata.dataUnspent,0.01, true);
2014-03-14 13:38:42 -07:00
u.length.should.equal(1);
});
2014-03-15 08:21:59 -07:00
it('#selectUnspent should return null if not enough utxos', function() {
2014-03-15 14:21:59 -07:00
var u = Transaction.selectUnspent(testdata.dataUnspent,1.12);
should.not.exist(u);
2014-03-14 23:27:06 -07:00
});
2014-03-14 13:38:42 -07:00
2014-03-14 23:27:06 -07:00
2014-03-15 08:21:59 -07:00
it('#selectUnspent should check confirmations', function() {
2014-03-15 14:21:59 -07:00
var u = Transaction.selectUnspent(testdata.dataUnspent,0.9);
should.not.exist(u);
2014-03-15 14:21:59 -07:00
var u = Transaction.selectUnspent(testdata.dataUnspent,0.9,true);
2014-03-15 08:21:59 -07:00
u.length.should.equal(3);
2014-03-15 14:21:59 -07:00
var u = Transaction.selectUnspent(testdata.dataUnspent,0.11);
2014-03-15 08:21:59 -07:00
u.length.should.equal(2);
2014-03-15 14:21:59 -07:00
var u = Transaction.selectUnspent(testdata.dataUnspent,0.111);
should.not.exist(u);
2014-03-15 08:21:59 -07:00
});
var opts = {remainderAddress: 'mwZabyZXg8JzUtFX1pkGygsMJjnuqiNhgd'};
it('#create should be able to create instance', function() {
2014-03-15 14:21:59 -07:00
var utxos = Transaction.selectUnspent(testdata.dataUnspent,0.1);
2014-03-14 23:27:06 -07:00
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
2014-03-15 08:21:59 -07:00
var tx = Transaction.create(utxos, outs, opts);
2014-03-14 23:27:06 -07:00
should.exist(tx);
2014-03-15 08:21:59 -07:00
2014-03-14 23:27:06 -07:00
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);
2014-03-15 14:21:59 -07:00
// remainder is 0.0299 here because unspent select utxos in order
2014-03-15 08:21:59 -07:00
util.valueToBigInt(tx.outs[1].v).cmp(2990000).should.equal(0);
});
it('#create should fail if not enough inputs ', function() {
2014-03-15 14:21:59 -07:00
var utxos = Transaction.selectUnspent(testdata.dataUnspent,1);
2014-03-15 08:21:59 -07:00
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() {
2014-03-15 14:21:59 -07:00
var utxos = Transaction.selectUnspent(testdata.dataUnspent,0.1);
2014-03-15 08:21:59 -07:00
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
var tx = Transaction.create(utxos, outs, opts);
2014-03-15 13:44:29 -07:00
// string output generated from: bitcoind createrawtransaction '[{"txid": "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1","vout":1},{"txid":"2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc2","vout":0} ]' '{"mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE":0.08,"mwZabyZXg8JzUtFX1pkGygsMJjnuqiNhgd":0.0299}'
2014-03-15 08:21:59 -07:00
tx.serialize().toString('hex').should.equal('0100000002c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffffc2cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0000000000ffffffff0200127a00000000001976a914774e603bafb717bd3f070e68bbcccfd907c77d1388acb09f2d00000000001976a914b00127584485a7cff0949ef0f6bc5575f06ce00d88ac00000000');
2014-03-15 08:22:15 -07:00
// no remainder
2014-03-15 08:21:59 -07:00
outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
tx = Transaction.create(utxos, outs, {fee:0.03} );
2014-03-15 13:44:29 -07:00
// string output generated from: bitcoind createrawtransaction '[{"txid": "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1","vout":1},{"txid":"2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc2","vout":0} ]' '{"mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE":0.08}'
//
2014-03-15 08:21:59 -07:00
tx.serialize().toString('hex').should.equal('0100000002c1cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0100000000ffffffffc2cf12ab89729d19d3cdec8ae531b5038d56c741006a105d532b3a7afa65c12a0000000000ffffffff0100127a00000000001976a914774e603bafb717bd3f070e68bbcccfd907c77d1388ac00000000');
2014-03-14 13:38:42 -07:00
});
2014-03-15 13:58:38 -07:00
it('#sign should sign a tx', function() {
var utxos = Transaction.selectUnspent(testdata.dataUnspentSign.unspent,0.1);
2014-03-15 13:58:38 -07:00
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
var tx = Transaction.create(utxos, outs, opts);
tx.sign(testdata.dataUnspentSign.keyStrings).should.equal(true);
2014-03-15 13:58:38 -07:00
var utxos2 = Transaction.selectUnspent(testdata.dataUnspentSign.unspent,16, true);
var outs2 = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
var tx2 = Transaction.create(utxos2, outs2, opts);
tx2.sign(testdata.dataUnspentSign.keyStrings).should.equal(true);
});
it('#sign should fail to sign a tx', function() {
var utxos = Transaction.selectUnspent(testdata.dataUnspentSign.unspent,0.1);
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
var tx = Transaction.create(utxos, outs, opts);
tx.sign(['cNpW8B7XPAzCdRR9RBWxZeveSNy3meXgHD8GuhcqUyDuy8ptCDzJ']).should.equal(false);
});
it('#sign should sign a tx in multiple steps', function() {
var utxos = Transaction.selectUnspent(testdata.dataUnspentSign.unspent,13, true);
var outs = [{address:'mrPnbY1yKDBsdgbHbS7kJ8GVm8F66hWHLE', amount:0.08}];
2014-03-15 13:58:38 -07:00
var tx = Transaction.create(utxos, outs, opts);
var k1 = testdata.dataUnspentSign.keyStrings.slice(0,1);
var k23 = testdata.dataUnspentSign.keyStrings.slice(1,3);
tx.sign(k1).should.equal(false);
tx.sign(k23).should.equal(true);
var tx2 = Transaction.create(utxos, outs, opts);
var k1 = testdata.dataUnspentSign.keyStrings.slice(0,1);
var k2 = testdata.dataUnspentSign.keyStrings.slice(1,2);
var k3 = testdata.dataUnspentSign.keyStrings.slice(2,3);
tx2.sign(k1).should.equal(false);
tx2.sign(k2).should.equal(false);
tx2.sign(k3).should.equal(true);
});
2014-03-14 13:38:42 -07:00
2014-02-27 13:09:02 -08:00
// Read tests from test/data/tx_valid.json
// Format is an array of arrays
// Inner arrays are either [ "comment" ]
// or [[[prevout hash, prevout index, prevout scriptPubKey], [input 2], ...],"], serializedTransaction, enforceP2SH
// ... where all scripts are stringified scripts.
2014-03-10 09:44:22 -07:00
testdata.dataTxValid.forEach(function(datum) {
2014-02-27 13:09:02 -08:00
if (datum.length === 3) {
it.skip('valid tx=' + datum[1], function(done) {
2014-02-27 13:09:02 -08:00
var inputs = datum[0];
var map = {};
2014-02-27 13:09:02 -08:00
inputs.forEach(function(vin) {
var hash = vin[0];
var index = vin[1];
var scriptPubKey = new Script(new Buffer(vin[2]));
2014-03-06 12:23:00 -08:00
map[[hash, index]] = scriptPubKey; //Script.fromStringContent(scriptPubKey);
console.log(scriptPubKey.getStringContent());
console.log('********************************');
2014-03-10 09:44:22 -07:00
done();
2014-02-06 07:57:47 -08:00
2014-02-27 13:09:02 -08:00
});
2014-02-28 04:37:02 -08:00
var raw = new Buffer(datum[1], 'hex');
2014-02-27 13:09:02 -08:00
var tx = new Transaction();
tx.parse(raw);
2014-02-27 13:09:02 -08:00
buffertools.toHex(tx.serialize()).should.equal(buffertools.toHex(raw));
var i = 0;
var stx = tx.getStandardizedObject();
2014-03-06 12:23:00 -08:00
tx.ins.forEach(function(txin) {
var scriptPubKey = map[[stx. in [i].prev_out.hash, stx. in [i].prev_out.n]];
i += 1;
});
2014-02-27 13:09:02 -08:00
});
}
});
});