diff --git a/integration/regtest.js b/integration/regtest.js index 0b693d7c..bf5c7ac5 100644 --- a/integration/regtest.js +++ b/integration/regtest.js @@ -275,6 +275,17 @@ describe('Daemon Binding Functionality', function() { hash.should.equal(tx.hash); }); + it('will throw an error if an unsigned transaction is sent', function() { + + var tx = bitcore.Transaction(); + tx.from(utxos[1]); + tx.change(privateKey.toAddress()); + tx.to(destKey.toAddress(), utxos[1].amount * 1e8 - 1000); + (function() { + bitcoind.sendTransaction(tx.uncheckedSerialize()); + }).should.throw('\x10: mandatory-script-verify-flag-failed (Operation not valid with the current stack size)'); + }); + }); describe('fee estimation', function() { diff --git a/src/libbitcoind.cc b/src/libbitcoind.cc index b3e0fd6d..0c3b8758 100644 --- a/src/libbitcoind.cc +++ b/src/libbitcoind.cc @@ -1478,10 +1478,7 @@ NAN_METHOD(SendTransaction) { // Attempt to add the transaction to the mempool if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !allowAbsurdFees)) { if (state.IsInvalid()) { - // TODO: use boost::lexical_cast or C++11 std::to_string - char errorMessage [1024]; - sprintf(errorMessage, "%i: %s", state.GetRejectCode(), state.GetRejectReason().c_str()); - return NanThrowError(errorMessage); + return NanThrowError((boost::lexical_cast(state.GetRejectCode()) + ": " + state.GetRejectReason()).c_str()); } else { if (fMissingInputs) { return NanThrowError("Missing inputs"); diff --git a/src/libbitcoind.h b/src/libbitcoind.h index 12bdc7b5..2d05341f 100644 --- a/src/libbitcoind.h +++ b/src/libbitcoind.h @@ -8,6 +8,7 @@ #include "txdb.h" #include #include +#include #include "nan.h" #include "scheduler.h" #include "core_io.h"