From cf1c01acea2d93606014408b10d017449eb41e6b Mon Sep 17 00:00:00 2001 From: Braydon Fuller Date: Tue, 15 Sep 2015 16:58:30 -0400 Subject: [PATCH] Bindings: Send transaction emit "tx" events. --- integration/regtest.js | 18 ++++++++++++++++++ src/libbitcoind.cc | 28 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/integration/regtest.js b/integration/regtest.js index bf5c7ac5..c43e0b76 100644 --- a/integration/regtest.js +++ b/integration/regtest.js @@ -286,6 +286,24 @@ describe('Daemon Binding Functionality', function() { }).should.throw('\x10: mandatory-script-verify-flag-failed (Operation not valid with the current stack size)'); }); + 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.on('tx', function(result) { + result.buffer.toString('hex').should.equal(serialized); + result.hash.should.equal(tx.hash); + result.mempool.should.equal(true); + done(); + }); + bitcoind.sendTransaction(serialized); + }); + }); describe('fee estimation', function() { diff --git a/src/libbitcoind.cc b/src/libbitcoind.cc index 0c3b8758..d3840963 100644 --- a/src/libbitcoind.cc +++ b/src/libbitcoind.cc @@ -96,6 +96,7 @@ init(Handle); static std::vector txmon_messages; static uv_async_t txmon_async; static Eternal txmon_callback; +static bool txmon_callback_available; static volatile bool shutdown_complete = false; static char *g_data_dir = NULL; @@ -219,6 +220,7 @@ NAN_METHOD(StartTxMon) { Local callback = Local::Cast(args[0]); Eternal cb(isolate, callback); txmon_callback = cb; + txmon_callback_available = true; CNodeSignals& nodeSignals = GetNodeSignals(); nodeSignals.ProcessMessages.connect(&scan_messages, boost::signals2::at_front); @@ -1493,6 +1495,32 @@ NAN_METHOD(SendTransaction) { // Relay the transaction connect peers RelayTransaction(tx); + // Notify any listeners about the transaction + if(txmon_callback_available) { + + Local results = Array::New(isolate); + Local obj = NanNew(); + + CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); + ssTx << tx; + std::string stx = ssTx.str(); + Local txBuffer = node::Buffer::New(isolate, stx.c_str(), stx.size()); + + obj->Set(NanNew("buffer"), txBuffer); + obj->Set(NanNew("hash"), NanNew(hashTx.GetHex())); + obj->Set(NanNew("mempool"), NanNew(true)); + + results->Set(0, obj); + + const unsigned argc = 1; + Local argv[argc] = { + Local::New(isolate, results) + }; + Local cb = txmon_callback.Get(isolate); + + cb->Call(isolate->GetCurrentContext()->Global(), argc, argv); + } + NanReturnValue(Local::New(isolate, NanNew(hashTx.GetHex()))); }