diff --git a/libraries/app/api.cpp b/libraries/app/api.cpp index 306e678b..5b61bc61 100644 --- a/libraries/app/api.cpp +++ b/libraries/app/api.cpp @@ -45,6 +45,10 @@ namespace graphene { namespace app { on_objects_removed(objs); }); _applied_block_connection = _db.applied_block.connect([this](const signed_block&){ on_applied_block(); }); + + _pending_trx_connection = _db.on_pending_transaction.connect([this](const signed_transaction& trx ){ + if( _pending_trx_callback ) _pending_trx_callback( fc::variant(trx) ); + }); } database_api::~database_api() diff --git a/libraries/app/include/graphene/app/api.hpp b/libraries/app/include/graphene/app/api.hpp index 4100a62f..ca83accd 100644 --- a/libraries/app/include/graphene/app/api.hpp +++ b/libraries/app/include/graphene/app/api.hpp @@ -366,6 +366,7 @@ namespace graphene { namespace app { vector get_required_fees( const vector& ops, asset_id_type id = asset_id_type() )const; void set_subscribe_callback( std::function cb, bool clear_filter ); + void set_pending_transaction_callback( std::function cb ){ _pending_trx_callback = cb; } private: template void subscribe_to_item( const T& i )const @@ -396,10 +397,12 @@ namespace graphene { namespace app { mutable fc::bloom_filter _subscribe_filter; std::function _subscribe_callback; + std::function _pending_trx_callback; boost::signals2::scoped_connection _change_connection; boost::signals2::scoped_connection _removed_connection; boost::signals2::scoped_connection _applied_block_connection; + boost::signals2::scoped_connection _pending_trx_connection; map< pair, std::function > _market_subscriptions; graphene::chain::database& _db; }; @@ -602,6 +605,7 @@ FC_API(graphene::app::database_api, (get_blinded_balances) (get_required_fees) (set_subscribe_callback) + (set_pending_transaction_callback) (validate_transaction) ) FC_API(graphene::app::history_api, diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 0181cfa0..5985e0fa 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -210,6 +210,9 @@ processed_transaction database::_push_transaction( const signed_transaction& trx notify_changed_objects(); // The transaction applied successfully. Merge its changes into the pending block session. session.merge(); + + // notify anyone listening to pending transactions + on_pending_transaction( trx ); return processed_trx; } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index c3fc26c8..a601b49c 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -196,6 +196,12 @@ namespace graphene { namespace chain { */ fc::signal applied_block; + /** + * This signal is emitted any time a new transaction is added to the pending + * block state. + */ + fc::signal on_pending_transaction; + /** * Emitted After a block has been applied and committed. The callback * should not yield and should execute quickly.