it('will not error and return the transaction hash', function(done) { // create and sign the transaction var tx = bitcore.Transaction(); tx.from(utxos[0]); tx.change(privateKey.toAddress()); tx.to(destKey.toAddress(), utxos[0].amount * 1e8 - 1000); tx.sign(bitcore.PrivateKey.fromWIF(utxos[0].privateKeyWIF)); // test sending the transaction bitcoind.sendTransaction(tx.serialize(), function(err, hash) { if (err) { return done(err); } hash.should.equal(tx.hash); done(); }); });
it('will emit "tx" events', function(done) { var tx = bitcore.Transaction(); tx.from(utxos[2]); tx.change(privateKey.toAddress()); tx.to(destKey.toAddress(), utxos[2].amount * 1e8 - 1000); tx.sign(bitcore.PrivateKey.fromWIF(utxos[2].privateKeyWIF)); var serialized = tx.serialize(); bitcoind.once('tx', function(buffer) { buffer.toString('hex').should.equal(serialized); done(); }); bitcoind.sendTransaction(serialized, function(err, hash) { if (err) { return done(err); } should.exist(hash); }); });
before(function(done) { /* jshint maxstatements: 50 */ // Finished once all blocks have been mined var startHeight = node.services.bitcoind.height; node.services.bitcoind.on('tip', function(height) { if (height === startHeight + 5) { done(); } }); testKey2 = bitcore.PrivateKey.fromWIF('cNfF4jXiLHQnFRsxaJyr2YSGcmtNYvxQYSakNhuDGxpkSzAwn95x'); address2 = testKey2.toAddress(regtest).toString(); testKey3 = bitcore.PrivateKey.fromWIF('cVTYQbaFNetiZcvxzXcVMin89uMLC43pEBMy2etgZHbPPxH5obYt'); address3 = testKey3.toAddress(regtest).toString(); testKey4 = bitcore.PrivateKey.fromWIF('cPNQmfE31H2oCUFqaHpfSqjDibkt7XoT2vydLJLDHNTvcddCesGw'); address4 = testKey4.toAddress(regtest).toString(); testKey5 = bitcore.PrivateKey.fromWIF('cVrzm9gCmnzwEVMGeCxY6xLVPdG3XWW97kwkFH3H3v722nb99QBF'); address5 = testKey5.toAddress(regtest).toString(); testKey6 = bitcore.PrivateKey.fromWIF('cPfMesNR2gsQEK69a6xe7qE44CZEZavgMUak5hQ74XDgsRmmGBYF'); address6 = testKey6.toAddress(regtest).toString(); var tx = new Transaction(); tx.from(unspentOutput); tx.to(address, 1 * 1e8); tx.to(address, 2 * 1e8); tx.to(address, 0.5 * 1e8); tx.to(address, 3 * 1e8); tx.fee(10000); tx.change(address); tx.sign(testKey); unspentOutputSpentTxId = tx.id; function mineBlock(next) { client.generate(1, function(err, response) { if (err) { throw err; } should.exist(response); next(); }); } node.sendTransaction(tx.serialize(), function(err, hash) { if (err) { return done(err); } client.generate(1, function(err, response) { if (err) { throw err; } should.exist(response); node.getAddressUnspentOutputs(address, false, function(err, results) { /* jshint maxstatements: 50 */ if (err) { throw err; } results.length.should.equal(5); async.series([ function(next) { var tx2 = new Transaction(); tx2Amount = results[0].satoshis - 10000; tx2.from(results[0]); tx2.to(address2, tx2Amount); tx2.change(address); tx2.sign(testKey); tx2Hash = tx2.hash; node.sendTransaction(tx2.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx3 = new Transaction(); tx3.from(results[1]); tx3.to(address3, results[1].satoshis - 10000); tx3.change(address); tx3.sign(testKey); node.sendTransaction(tx3.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx4 = new Transaction(); tx4.from(results[2]); tx4.to(address4, results[2].satoshis - 10000); tx4.change(address); tx4.sign(testKey); node.sendTransaction(tx4.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx5 = new Transaction(); tx5.from(results[3]); tx5.from(results[4]); tx5.to(address5, results[3].satoshis - 10000); tx5.to(address6, results[4].satoshis - 10000); tx5.change(address); tx5.sign(testKey); node.sendTransaction(tx5.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); } ], function(err) { if (err) { throw err; } }); }); }); }); });
describe('Messages', function() { var privateKey = bitcore.PrivateKey.fromWIF('cQwApHAg8hw9AZuxiU4a7g9kFWdaemhPxVZXWiAKgJTx6dPP32fN'); var address = 'yYjwsLsPUmsfe3RJ5YqZdJYC2Y9tzHYMWL'; var badAddress = 'yYjwsLsPUmsfe3RJ5YqZdJYC2Y9tzHYMWW'; var signature = 'H2TSaZyMt9/oLqqgQzE2iBKNlPVfPp6XOVP7LiNDFU3sdiHahS+aemajhhp4XDaRClee/hlUkJtF0Nuqm3egpPw='; var message = 'cellar door'; it('will verify a message (true)', function(done) { var controller = new MessagesController({node: {}}); var req = { body: { 'address': address, 'signature': signature, 'message': message }, query: {} }; var res = { json: function(data) { data.result.should.equal(true); done(); } }; controller.verify(req, res); }); it('will verify a message (false)', function(done) { var controller = new MessagesController({node: {}}); var req = { body: { 'address': address, 'signature': signature, 'message': 'wrong message' }, query: {} }; var res = { json: function(data) { data.result.should.equal(false); done(); } }; controller.verify(req, res); }); it('handle an error from message verification', function(done) { var controller = new MessagesController({node: {}}); var req = { body: { 'address': badAddress, 'signature': signature, 'message': message }, query: {} }; var send = sinon.stub(); var status = sinon.stub().returns({send: send}); var res = { status: status, }; controller.verify(req, res); status.args[0][0].should.equal(400); send.args[0][0].should.equal('Unexpected error: Checksum mismatch. Code:1'); done(); }); it('handle error with missing parameters', function(done) { var controller = new MessagesController({node: {}}); var req = { body: {}, query: {} }; var send = sinon.stub(); var status = sinon.stub().returns({send: send}); var res = { status: status }; controller.verify(req, res); status.args[0][0].should.equal(400); send.args[0][0].should.match(/^Missing parameters/); done(); }); });
before(function(done) { /* jshint maxstatements: 50 */ // Finished once all blocks have been mined var startHeight = node.services.bitcoind.height; node.services.bitcoind.on('tip', function(height) { if (height === startHeight + 5) { done(); } }); testKey2 = bitcore.PrivateKey.fromWIF('7sTymLSNn9SoCrb2awe7fUcjTHns8HXDWNnCzKqC1K5D1GXzTJv'); address2 = testKey2.toAddress(regtest).toString(); testKey3 = bitcore.PrivateKey.fromWIF('7rx9vzpRJpydL8p6wMX71U1UTtkWkymBJMxHoYduBn4KnL5c591'); address3 = testKey3.toAddress(regtest).toString(); testKey4 = bitcore.PrivateKey.fromWIF('7s7WGhd7hB3e1ZSpwhd2hyc9aSkDYamEYNqvYrXHPJbgvfMmXec'); address4 = testKey4.toAddress(regtest).toString(); testKey5 = bitcore.PrivateKey.fromWIF('7rtwSf4qmiGuaxJGPQzHZ2SsiocXfVitoFrfQt17EFMgsA491pd'); address5 = testKey5.toAddress(regtest).toString(); testKey6 = bitcore.PrivateKey.fromWIF('7r859FVkts4gRPDB3xzjGMwVkvDxEoV9EVTNW9ijwy4Riqankdw'); address6 = testKey6.toAddress(regtest).toString(); var tx = new Transaction(); tx.from(unspentOutput); tx.to(address, 1 * 1e8); tx.to(address, 2 * 1e8); tx.to(address, 0.5 * 1e8); tx.to(address, 3 * 1e8); tx.fee(10000); tx.change(address); tx.sign(testKey); unspentOutputSpentTxId = tx.id; function mineBlock(next) { client.generate(1, function(err, response) { if (err) { throw err; } should.exist(response); next(); }); } node.sendTransaction(tx.serialize(), function(err, hash) { if (err) { return done(err); } client.generate(1, function(err, response) { if (err) { throw err; } should.exist(response); node.getAddressUnspentOutputs(address, false, function(err, results) { /* jshint maxstatements: 50 */ if (err) { throw err; } results.length.should.equal(5); async.series([ function(next) { var tx2 = new Transaction(); tx2Amount = results[0].satoshis - 10000; tx2.from(results[0]); tx2.to(address2, tx2Amount); tx2.change(address); tx2.sign(testKey); tx2Hash = tx2.hash; node.sendTransaction(tx2.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx3 = new Transaction(); tx3.from(results[1]); tx3.to(address3, results[1].satoshis - 10000); tx3.change(address); tx3.sign(testKey); node.sendTransaction(tx3.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx4 = new Transaction(); tx4.from(results[2]); tx4.to(address4, results[2].satoshis - 10000); tx4.change(address); tx4.sign(testKey); node.sendTransaction(tx4.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); }, function(next) { var tx5 = new Transaction(); tx5.from(results[3]); tx5.from(results[4]); tx5.to(address5, results[3].satoshis - 10000); tx5.to(address6, results[4].satoshis - 10000); tx5.change(address); tx5.sign(testKey); node.sendTransaction(tx5.serialize(), function(err) { if (err) { return next(err); } mineBlock(next); }); } ], function(err) { if (err) { throw err; } }); }); }); }); });