BitShares-Core  6.1.0
BitShares blockchain implementation and command-line interface software
database_api_impl.hxx
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017 Cryptonomex, Inc., and contributors.
3  *
4  * The MIT License
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #pragma once
25 
26 #include <fc/bloom_filter.hpp>
27 #include "database_api_helper.hxx"
28 
29 #define GET_REQUIRED_FEES_MAX_RECURSION 4
30 
31 namespace graphene { namespace app {
32 
33 using market_queue_type = std::map< std::pair<graphene::chain::asset_id_type, graphene::chain::asset_id_type>,
34  std::vector<fc::variant> >;
35 
36 class database_api_impl : public std::enable_shared_from_this<database_api_impl>, public database_api_helper
37 {
38  public:
40  virtual ~database_api_impl();
41 
42  // Objects
43  fc::variants get_objects( const vector<object_id_type>& ids, optional<bool> subscribe )const;
44 
45  // Subscriptions
46  void set_subscribe_callback( std::function<void(const variant&)> cb, bool notify_remove_create );
47  void set_auto_subscription( bool enable );
48  void set_pending_transaction_callback( std::function<void(const variant&)> cb );
49  void set_block_applied_callback( std::function<void(const variant& block_id)> cb );
50  void cancel_all_subscriptions(bool reset_callback, bool reset_market_subscriptions);
51 
52  // Blocks and transactions
53  optional<maybe_signed_block_header> get_block_header( uint32_t block_num, bool with_witness_signature )const;
54  map<uint32_t, optional<maybe_signed_block_header>> get_block_header_batch(
55  const vector<uint32_t>& block_nums, bool with_witness_signatures )const;
56  optional<signed_block> get_block(uint32_t block_num)const;
57  processed_transaction get_transaction( uint32_t block_num, uint32_t trx_in_block )const;
58 
59  // Globals
65  object_id_type get_next_object_id( uint8_t space_id, uint8_t type_id, bool with_pending_transactions )const;
66 
67  // Keys
68  vector<flat_set<account_id_type>> get_key_references( vector<public_key_type> key )const;
69  bool is_public_key_registered(string public_key) const;
70 
71  // Accounts
72  vector<optional<account_object>> get_accounts( const vector<std::string>& account_names_or_ids,
73  optional<bool> subscribe )const;
74  map<string, full_account, std::less<>> get_full_accounts( const vector<string>& names_or_ids,
75  const optional<bool>& subscribe );
76  vector<account_statistics_object> get_top_voters(uint32_t limit)const;
77  optional<account_object> get_account_by_name( string name )const;
78  vector<account_id_type> get_account_references( const std::string account_id_or_name )const;
79  vector<optional<account_object>> lookup_account_names(const vector<string>& account_names)const;
80  map<string, account_id_type, std::less<>> lookup_accounts( const string& lower_bound_name,
81  uint32_t limit,
82  const optional<bool>& subscribe )const;
83  uint64_t get_account_count()const;
84 
85  // Balances
86  vector<asset> get_account_balances( const std::string& account_name_or_id,
87  const flat_set<asset_id_type>& assets )const;
88  vector<asset> get_named_account_balances(const std::string& name, const flat_set<asset_id_type>& assets)const;
89  vector<balance_object> get_balance_objects( const vector<address>& addrs )const;
90  vector<asset> get_vested_balances( const vector<balance_id_type>& objs )const;
91  vector<vesting_balance_object> get_vesting_balances( const std::string account_id_or_name )const;
92 
93  // Assets
94  uint64_t get_asset_count()const;
95  vector<optional<extended_asset_object>> get_assets( const vector<std::string>& asset_symbols_or_ids,
96  optional<bool> subscribe )const;
97  vector<extended_asset_object> list_assets(const string& lower_bound_symbol, uint32_t limit)const;
98  vector<optional<extended_asset_object>> lookup_asset_symbols(const vector<string>& symbols_or_ids)const;
99  vector<extended_asset_object> get_assets_by_issuer(const std::string& issuer_name_or_id,
100  asset_id_type start, uint32_t limit)const;
101 
102  // Markets / feeds
103  vector<limit_order_object> get_limit_orders( const std::string& a, const std::string& b,
104  uint32_t limit)const;
105  vector<limit_order_object> get_limit_orders_by_account( const string& account_name_or_id,
106  const optional<uint32_t>& limit,
107  const optional<limit_order_id_type>& start_id );
108  vector<limit_order_object> get_account_limit_orders( const string& account_name_or_id,
109  const string &base,
110  const string &quote, uint32_t limit,
111  optional<limit_order_id_type> ostart_id,
112  optional<price> ostart_price );
113  vector<call_order_object> get_call_orders(const std::string& a, uint32_t limit)const;
114  vector<call_order_object> get_call_orders_by_account(const std::string& account_name_or_id,
115  asset_id_type start, uint32_t limit)const;
116  vector<force_settlement_object> get_settle_orders(const std::string& a, uint32_t limit)const;
117  vector<force_settlement_object> get_settle_orders_by_account(const std::string& account_name_or_id,
118  force_settlement_id_type start,
119  uint32_t limit)const;
120  vector<collateral_bid_object> get_collateral_bids( const std::string& asset,
121  uint32_t limit, uint32_t start)const;
122 
123  void subscribe_to_market( std::function<void(const variant&)> callback,
124  const std::string& a, const std::string& b );
125  void unsubscribe_from_market(const std::string& a, const std::string& b);
126 
127  market_ticker get_ticker( const string& base, const string& quote,
128  bool skip_order_book = false )const;
129  market_volume get_24_volume( const string& base, const string& quote )const;
130  order_book get_order_book( const string& base, const string& quote,
131  uint32_t limit )const;
132  vector<market_ticker> get_top_markets( uint32_t limit )const;
133  vector<market_trade> get_trade_history( const string& base, const string& quote,
135  uint32_t limit )const;
136  vector<market_trade> get_trade_history_by_sequence( const string& base, const string& quote,
137  int64_t start, fc::time_point_sec stop,
138  uint32_t limit )const;
139 
140  // Liquidity pools
141  vector<extended_liquidity_pool_object> get_liquidity_pools_by_one_asset(
142  const std::string& asset_symbol_or_id,
143  const optional<uint32_t>& limit,
144  const optional<liquidity_pool_id_type>& start_id,
145  const optional<bool>& with_statistics )const;
146  vector<optional<extended_liquidity_pool_object>> get_liquidity_pools(
147  const vector<liquidity_pool_id_type>& ids,
148  const optional<bool>& subscribe,
149  const optional<bool>& with_statistics )const;
150  vector<optional<extended_liquidity_pool_object>> get_liquidity_pools_by_share_asset(
151  const vector<std::string>& asset_symbols_or_ids,
152  const optional<bool>& subscribe,
153  const optional<bool>& with_statistics )const;
154  vector<extended_liquidity_pool_object> get_liquidity_pools_by_owner(
155  const std::string& account_name_or_id,
156  const optional<uint32_t>& limit,
157  const optional<asset_id_type>& start_id,
158  const optional<bool>& with_statistics )const;
159 
160  // Witnesses
161  vector<optional<witness_object>> get_witnesses(const vector<witness_id_type>& witness_ids)const;
162  fc::optional<witness_object> get_witness_by_account(const std::string& account_id_or_name)const;
163  map<string, witness_id_type, std::less<>> lookup_witness_accounts(
164  const string& lower_bound_name, uint32_t limit )const;
165  uint64_t get_witness_count()const;
166 
167  // Committee members
168  vector<optional<committee_member_object>> get_committee_members(
169  const vector<committee_member_id_type>& committee_member_ids )const;
171  const std::string& account_id_or_name )const;
172  map<string, committee_member_id_type, std::less<>> lookup_committee_member_accounts(
173  const string& lower_bound_name, uint32_t limit )const;
174  uint64_t get_committee_count()const;
175 
176  // Workers
177  vector<worker_object> get_all_workers( const optional<bool>& is_expired )const;
178  vector<worker_object> get_workers_by_account(const std::string& account_id_or_name)const;
179  uint64_t get_worker_count()const;
180 
181  // Votes
182  vector<variant> lookup_vote_ids( const vector<vote_id_type>& votes )const;
183 
184  // Authority / validation
185  std::string get_transaction_hex(const signed_transaction& trx)const;
186  std::string get_transaction_hex_without_sig(const transaction& trx)const;
187 
188  set<public_key_type> get_required_signatures( const signed_transaction& trx,
189  const flat_set<public_key_type>& available_keys )const;
190  set<public_key_type> get_potential_signatures( const signed_transaction& trx )const;
191  set<address> get_potential_address_signatures( const signed_transaction& trx )const;
192  bool verify_authority( const signed_transaction& trx )const;
193  bool verify_account_authority( const string& account_name_or_id,
194  const flat_set<public_key_type>& signers )const;
195  processed_transaction validate_transaction( const signed_transaction& trx )const;
196  vector< fc::variant > get_required_fees( const vector<operation>& ops,
197  const std::string& asset_id_or_symbol )const;
198 
199  // Proposed transactions
200  vector<proposal_object> get_proposed_transactions( const std::string account_id_or_name )const;
201 
202  // Blinded balances
203  vector<blinded_balance_object> get_blinded_balances( const flat_set<commitment_type>& commitments )const;
204 
205  // Withdrawals
206  vector<withdraw_permission_object> get_withdraw_permissions_by_giver( const std::string account_id_or_name,
207  withdraw_permission_id_type start,
208  uint32_t limit )const;
209  vector<withdraw_permission_object> get_withdraw_permissions_by_recipient( const std::string account_id_or_name,
210  withdraw_permission_id_type start,
211  uint32_t limit )const;
212 
213  // HTLC
214  optional<htlc_object> get_htlc( htlc_id_type id, optional<bool> subscribe ) const;
215  vector<htlc_object> get_htlc_by_from( const std::string account_id_or_name,
216  htlc_id_type start, uint32_t limit ) const;
217  vector<htlc_object> get_htlc_by_to( const std::string account_id_or_name,
218  htlc_id_type start, uint32_t limit) const;
219  vector<htlc_object> list_htlcs(const htlc_id_type lower_bound_id, uint32_t limit) const;
220 
221  //private:
222 
224  // Accounts
226 
228  // Assets
230 
231  template<class ASSET>
233  {
234  asset_id_type id = a.get_id();
235  extended_asset_object result = extended_asset_object( std::forward<ASSET>( a ) );
237  {
239  if( result.bitasset_data_id.valid() )
241  }
242  return result;
243  }
244 
245  // helper function
246  vector<optional<extended_asset_object>> get_assets( const vector<asset_id_type>& asset_ids,
247  optional<bool> subscribe = optional<bool>() )const;
248 
250  // Markets
252 
253  // helper function
254  vector<limit_order_object> get_limit_orders( const asset_id_type a, const asset_id_type b,
255  const uint32_t limit )const;
256 
258  // Liquidity pools
260 
261  template<class LP>
263  {
264  liquidity_pool_id_type id = a.get_id();
265  extended_liquidity_pool_object result = extended_liquidity_pool_object( std::forward<LP>( a ) );
266  if( with_stats && _app_options && _app_options->has_market_history_plugin )
267  {
268  liquidity_pool_ticker_id_type ticker_id( id.instance );
269  const liquidity_pool_ticker_object* ticker = _db.find( ticker_id );
270  if( ticker )
271  result.statistics = *ticker;
272  }
273  return result;
274  }
275 
276  // template function to reduce duplicate code
277  template <typename INDEX_TAG, typename... X>
278  vector<extended_liquidity_pool_object> get_liquidity_pools_by_asset_x(
279  const optional<uint32_t>& olimit,
280  const optional<liquidity_pool_id_type>& ostart_id,
281  const optional<bool>& with_statistics,
282  X... x )const
283  {
284  FC_ASSERT( _app_options, "Internal error" );
285  const auto configured_limit = _app_options->api_limit_get_liquidity_pools;
286  uint32_t limit = olimit.valid() ? *olimit : configured_limit;
287  FC_ASSERT( limit <= configured_limit,
288  "limit can not be greater than ${configured_limit}",
289  ("configured_limit", configured_limit) );
290 
291  bool with_stats = ( with_statistics.valid() && *with_statistics );
292 
293  vector<extended_liquidity_pool_object> results;
294 
295  liquidity_pool_id_type start_pool_id = ostart_id.valid() ? *ostart_id : liquidity_pool_id_type();
296  object_id_type start_id { start_pool_id };
297 
298  const auto& idx = _db.get_index_type<liquidity_pool_index>().indices().get<INDEX_TAG>();
299 
300  auto lower_itr = idx.lower_bound( make_tuple_if_multiple( x..., start_id ) );
301  auto upper_itr = call_end_or_upper_bound( idx, x... );
302 
303  results.reserve( limit );
304  for ( ; lower_itr != upper_itr && results.size() < limit; ++lower_itr )
305  {
306  results.emplace_back( extend_liquidity_pool( *lower_itr, with_stats ) );
307  }
308 
309  return results;
310  }
311 
313  // Subscription
315 
316  // Decides whether to subscribe using member variables and given parameter
317  bool get_whether_to_subscribe( optional<bool> subscribe )const
318  {
319  if( !_subscribe_callback )
320  return false;
321  if( subscribe.valid() )
322  return *subscribe;
324  }
325 
326  // Note:
327  // Different type of object_id<T> objects could become identical after packed.
328  // For example, both `account_id_type a=1.2.0` and `asset_id_type b=1.3.0` will become `0` after packed.
329  // In order to avoid collision, we don't use a template function here, instead, we implicitly convert all
330  // object IDs to `object_id_type` when subscribing.
331  //
332  // If need to subscribe to other data types, override this function with the types as parameter.
333  // For example, we had a `get_subscription_key( const public_key_type& item )` function here, which was
334  // removed lately since we no longer subscribe to public keys.
335  vector<char> get_subscription_key( const object_id_type& item )const
336  {
337  return fc::raw::pack(item);
338  }
339 
340  template<typename T>
341  void subscribe_to_item( const T& item )const
342  {
343  if( !_subscribe_callback )
344  return;
345 
346  vector<char> key = get_subscription_key( object_id_type(item) );
347  if( !_subscribe_filter.contains( key.data(), key.size() ) )
348  {
349  _subscribe_filter.insert( key.data(), key.size() );
350  }
351  }
352 
353  template<typename T>
354  bool is_subscribed_to_item( const T& item )const
355  {
356  if( !_subscribe_callback )
357  return false;
358 
359  vector<char> key = get_subscription_key( object_id_type(item) );
360  return _subscribe_filter.contains( key.data(), key.size() );
361  }
362 
363  // for full-account subscription
364  bool is_impacted_account( const flat_set<account_id_type>& accounts );
365 
366  // for market subscription
367  template<typename T>
368  const std::pair<asset_id_type,asset_id_type> get_order_market( const T& order )
369  {
370  return order.get_market();
371  }
372 
373  // for market subscription
374  const std::pair<asset_id_type,asset_id_type> get_order_market( const force_settlement_object& order )
375  {
376  // TODO cache the result to avoid repeatly fetching from db
377  asset_id_type backing_id = order.balance.asset_id( _db ).bitasset_data( _db ).options.short_backing_asset;
378  auto tmp = std::make_pair( order.balance.asset_id, backing_id );
379  if( tmp.first > tmp.second ) std::swap( tmp.first, tmp.second );
380  return tmp;
381  }
382 
383  template<typename T>
384  void enqueue_if_subscribed_to_market(const object* obj, market_queue_type& queue, bool full_object=true)
385  {
386  const T* order = dynamic_cast<const T*>(obj);
387  FC_ASSERT( order != nullptr);
388 
389  const auto& market = get_order_market( *order );
390 
391  auto sub = _market_subscriptions.find( market );
392  if( sub != _market_subscriptions.end() ) {
393  queue[market].emplace_back( full_object ? obj->to_variant() : fc::variant(obj->id, 1) );
394  }
395  }
396 
397  void broadcast_updates( const vector<variant>& updates );
398  void broadcast_market_updates( const market_queue_type& queue);
399  void handle_object_changed( bool force_notify,
400  bool full_object,
401  const vector<object_id_type>& ids,
402  const flat_set<account_id_type>& impacted_accounts,
403  std::function<const object*(object_id_type id)> find_object );
404 
406  void on_objects_new(const vector<object_id_type>& ids, const flat_set<account_id_type>& impacted_accounts);
407  void on_objects_changed(const vector<object_id_type>& ids, const flat_set<account_id_type>& impacted_accounts);
408  void on_objects_removed(const vector<object_id_type>& ids, const vector<const object*>& objs,
409  const flat_set<account_id_type>& impacted_accounts);
410  void on_applied_block();
411 
413  // Member variables
415 
416  bool _notify_remove_create = false;
418 
420  std::set<account_id_type> _subscribed_accounts;
421 
422  std::function<void(const fc::variant&)> _subscribe_callback;
423  std::function<void(const fc::variant&)> _pending_trx_callback;
424  std::function<void(const fc::variant&)> _block_applied_callback;
425 
431 
432  map< pair<asset_id_type,asset_id_type>, std::function<void(const variant&)> > _market_subscriptions;
433 
437 };
438 
439 } } // graphene::app
vector< optional< extended_asset_object > > lookup_asset_symbols(const vector< string > &symbols_or_ids) const
void insert(const unsigned char *key_begin, const std::size_t &length)
vector< optional< account_object > > get_accounts(const vector< std::string > &account_names_or_ids, optional< bool > subscribe) const
object_id_type get_next_object_id(uint8_t space_id, uint8_t type_id, bool with_pending_transactions) const
void on_objects_removed(const vector< object_id_type > &ids, const vector< const object *> &objs, const flat_set< account_id_type > &impacted_accounts)
const graphene::api_helper_indexes::asset_in_liquidity_pools_index * asset_in_liquidity_pools_index
map< pair< asset_id_type, asset_id_type >, std::function< void(const variant &)> > _market_subscriptions
vector< account_statistics_object > get_top_voters(uint32_t limit) const
This secondary index tracks the next ID of all object types.
void on_objects_changed(const vector< object_id_type > &ids, const flat_set< account_id_type > &impacted_accounts)
vector< blinded_balance_object > get_blinded_balances(const flat_set< commitment_type > &commitments) const
void set_subscribe_callback(std::function< void(const variant &)> cb, bool notify_remove_create)
vector< extended_asset_object > list_assets(const string &lower_bound_symbol, uint32_t limit) const
vector< force_settlement_object > get_settle_orders(const std::string &a, uint32_t limit) const
market_volume get_24_volume(const string &base, const string &quote) const
vector< withdraw_permission_object > get_withdraw_permissions_by_giver(const std::string account_id_or_name, withdraw_permission_id_type start, uint32_t limit) const
void set_block_applied_callback(std::function< void(const variant &block_id)> cb)
void pack(Stream &s, const flat_set< T, A... > &value, uint32_t _max_depth)
Definition: flat.hpp:11
order_book get_order_book(const string &base, const string &quote, uint32_t limit) const
fc::optional< witness_object > get_witness_by_account(const std::string &account_id_or_name) const
fc::optional< committee_member_object > get_committee_member_by_account(const std::string &account_id_or_name) const
std::function< void(const fc::variant &)> _pending_trx_callback
bool verify_account_authority(const string &account_name_or_id, const flat_set< public_key_type > &signers) const
boost::signals2::scoped_connection _change_connection
std::map< std::pair< graphene::chain::asset_id_type, graphene::chain::asset_id_type >, std::vector< fc::variant > > market_queue_type
map< string, full_account, std::less<> > get_full_accounts(const vector< string > &names_or_ids, const optional< bool > &subscribe)
void set_auto_subscription(bool enable)
vector< withdraw_permission_object > get_withdraw_permissions_by_recipient(const std::string account_id_or_name, withdraw_permission_id_type start, uint32_t limit) const
vector< optional< extended_asset_object > > get_assets(const vector< std::string > &asset_symbols_or_ids, optional< bool > subscribe) const
share_type get_backing_collateral(const asset_id_type &asset) const
void subscribe_to_market(std::function< void(const variant &)> callback, const std::string &a, const std::string &b)
void unsubscribe_from_market(const std::string &a, const std::string &b)
bool is_impacted_account(const flat_set< account_id_type > &accounts)
Maintains global state information (committee_member list, current fees)This is an implementation det...
tracks the blockchain state in an extensible manner
Definition: database.hpp:70
fc::variant_object get_config() const
std::string get_transaction_hex(const signed_transaction &trx) const
An order-perserving dictionary of variant&#39;s.
const IndexType & get_index_type() const
map< uint32_t, optional< maybe_signed_block_header > > get_block_header_batch(const vector< uint32_t > &block_nums, bool with_witness_signatures) const
Definition: api.cpp:48
vector< call_order_object > get_call_orders_by_account(const std::string &account_name_or_id, asset_id_type start, uint32_t limit) const
vector< htlc_object > get_htlc_by_to(const std::string account_id_or_name, htlc_id_type start, uint32_t limit) const
vector< proposal_object > get_proposed_transactions(const std::string account_id_or_name) const
const std::pair< asset_id_type, asset_id_type > get_order_market(const force_settlement_object &order)
processed_transaction get_transaction(uint32_t block_num, uint32_t trx_in_block) const
database_api_impl(graphene::chain::database &db, const application_options *app_options)
vector< asset > get_vested_balances(const vector< balance_id_type > &objs) const
std::vector< variant > variants
Definition: variant.hpp:170
void set_pending_transaction_callback(std::function< void(const variant &)> cb)
void broadcast_updates(const vector< variant > &updates)
vector< optional< witness_object > > get_witnesses(const vector< witness_id_type > &witness_ids) const
std::function< void(const fc::variant &)> _block_applied_callback
This secondary index maintains a map to make it easier to find liquidity pools by any asset in the po...
boost::signals2::scoped_connection _pending_trx_connection
optional< share_type > total_backing_collateral
vector< fc::variant > get_required_fees(const vector< operation > &ops, const std::string &asset_id_or_symbol) const
vector< account_id_type > get_account_references(const std::string account_id_or_name) const
bool verify_authority(const signed_transaction &trx) const
vector< asset > get_account_balances(const std::string &account_name_or_id, const flat_set< asset_id_type > &assets) const
set< address > get_potential_address_signatures(const signed_transaction &trx) const
set< public_key_type > get_required_signatures(const signed_transaction &trx, const flat_set< public_key_type > &available_keys) const
vector< market_trade > get_trade_history_by_sequence(const string &base, const string &quote, int64_t start, fc::time_point_sec stop, uint32_t limit) const
bool is_subscribed_to_item(const T &item) const
provides stack-based nullable value similar to boost::optional
Definition: optional.hpp:20
void enqueue_if_subscribed_to_market(const object *obj, market_queue_type &queue, bool full_object=true)
vector< char > get_subscription_key(const object_id_type &item) const
optional< account_object > get_account_by_name(string name) const
std::set< account_id_type > _subscribed_accounts
object_id< SpaceID, TypeID > get_id() const
Definition: object.hpp:113
vector< limit_order_object > get_account_limit_orders(const string &account_name_or_id, const string &base, const string &quote, uint32_t limit, optional< limit_order_id_type > ostart_id, optional< price > ostart_price)
const T * find(const object_id_type &id) const
std::string get_transaction_hex_without_sig(const transaction &trx) const
void handle_object_changed(bool force_notify, bool full_object, const vector< object_id_type > &ids, const flat_set< account_id_type > &impacted_accounts, std::function< const object *(object_id_type id)> find_object)
vector< limit_order_object > get_limit_orders_by_account(const string &account_name_or_id, const optional< uint32_t > &limit, const optional< limit_order_id_type > &start_id)
market_ticker get_ticker(const string &base, const string &quote, bool skip_order_book=false) const
vector< extended_asset_object > get_assets_by_issuer(const std::string &issuer_name_or_id, asset_id_type start, uint32_t limit) const
This secondary index tracks how much of each asset is locked up as collateral for MPAs...
bool valid() const
Definition: optional.hpp:186
optional< signed_block > get_block(uint32_t block_num) const
const object & get(object_id_type id) const
Definition: index.hpp:110
optional< liquidity_pool_ticker_object > statistics
vector< optional< account_object > > lookup_account_names(const vector< string > &account_names) const
map< string, witness_id_type, std::less<> > lookup_witness_accounts(const string &lower_bound_name, uint32_t limit) const
vector< optional< extended_liquidity_pool_object > > get_liquidity_pools(const vector< liquidity_pool_id_type > &ids, const optional< bool > &subscribe, const optional< bool > &with_statistics) const
std::function< void(const fc::variant &)> _subscribe_callback
tracks bitassets scheduled for force settlement at some point in the future.
const application_options * _app_options
vector< worker_object > get_all_workers(const optional< bool > &is_expired) const
#define FC_ASSERT(TEST,...)
Checks a condition and throws an assert_exception if the test is FALSE.
Definition: exception.hpp:345
void subscribe_to_item(const T &item) const
vector< htlc_object > list_htlcs(const htlc_id_type lower_bound_id, uint32_t limit) const
vector< optional< extended_liquidity_pool_object > > get_liquidity_pools_by_share_asset(const vector< std::string > &asset_symbols_or_ids, const optional< bool > &subscribe, const optional< bool > &with_statistics) const
stores null, int64, uint64, double, bool, string, std::vector<variant>, and variant_object&#39;s.
Definition: variant.hpp:198
vector< variant > lookup_vote_ids(const vector< vote_id_type > &votes) const
chain_property_object get_chain_properties() const
vector< flat_set< account_id_type > > get_key_references(vector< public_key_type > key) const
bool is_public_key_registered(string public_key) const
vector< collateral_bid_object > get_collateral_bids(const std::string &asset, uint32_t limit, uint32_t start) const
vector< market_trade > get_trade_history(const string &base, const string &quote, fc::time_point_sec start, fc::time_point_sec stop, uint32_t limit) const
global_property_object get_global_properties() const
chain_id_type get_chain_id() const
virtual bool contains(const unsigned char *key_begin, const std::size_t length) const
boost::signals2::scoped_connection _new_connection
processed_transaction validate_transaction(const signed_transaction &trx) const
boost::signals2::scoped_connection _applied_block_connection
optional< htlc_object > get_htlc(htlc_id_type id, optional< bool > subscribe) const
map< string, account_id_type, std::less<> > lookup_accounts(const string &lower_bound_name, uint32_t limit, const optional< bool > &subscribe) const
void on_objects_new(const vector< object_id_type > &ids, const flat_set< account_id_type > &impacted_accounts)
share_type get_amount_in_collateral(const asset_id_type &asset) const
vector< worker_object > get_workers_by_account(const std::string &account_id_or_name) const
void broadcast_market_updates(const market_queue_type &queue)
vector< htlc_object > get_htlc_by_from(const std::string account_id_or_name, htlc_id_type start, uint32_t limit) const
dynamic_global_property_object get_dynamic_global_properties() const
set< public_key_type > get_potential_signatures(const signed_transaction &trx) const
asset_id_type asset_id
Definition: asset.hpp:37
optional< maybe_signed_block_header > get_block_header(uint32_t block_num, bool with_witness_signature) const
vector< limit_order_object > get_limit_orders(const std::string &a, const std::string &b, uint32_t limit) const
Maintains global state information (committee_member list, current fees)This is an implementation det...
vector< vesting_balance_object > get_vesting_balances(const std::string account_id_or_name) const
vector< market_ticker > get_top_markets(uint32_t limit) const
vector< optional< committee_member_object > > get_committee_members(const vector< committee_member_id_type > &committee_member_ids) const
const std::pair< asset_id_type, asset_id_type > get_order_market(const T &order)
optional< share_type > total_in_collateral
extended_asset_object extend_asset(ASSET &&a) const
vector< extended_liquidity_pool_object > get_liquidity_pools_by_one_asset(const std::string &asset_symbol_or_id, const optional< uint32_t > &limit, const optional< liquidity_pool_id_type > &start_id, const optional< bool > &with_statistics) const
vector< balance_object > get_balance_objects(const vector< address > &addrs) const
vector< extended_liquidity_pool_object > get_liquidity_pools_by_owner(const std::string &account_name_or_id, const optional< uint32_t > &limit, const optional< asset_id_type > &start_id, const optional< bool > &with_statistics) const
optional< asset_bitasset_data_id_type > bitasset_data_id
Extra data associated with BitAssets. This field is non-null if and only if is_market_issued() return...
boost::signals2::scoped_connection scoped_connection
Definition: signals.hpp:22
void cancel_all_subscriptions(bool reset_callback, bool reset_market_subscriptions)
auto call_end_or_upper_bound(const T &t) const
bool get_whether_to_subscribe(optional< bool > subscribe) const
captures the result of evaluating the operations contained in the transaction
map< string, committee_member_id_type, std::less<> > lookup_committee_member_accounts(const string &lower_bound_name, uint32_t limit) const
vector< force_settlement_object > get_settle_orders_by_account(const std::string &account_name_or_id, force_settlement_id_type start, uint32_t limit) const
vector< extended_liquidity_pool_object > get_liquidity_pools_by_asset_x(const optional< uint32_t > &olimit, const optional< liquidity_pool_id_type > &ostart_id, const optional< bool > &with_statistics, X... x) const
vector< asset > get_named_account_balances(const std::string &name, const flat_set< asset_id_type > &assets) const
vector< call_order_object > get_call_orders(const std::string &a, uint32_t limit) const
const graphene::api_helper_indexes::amount_in_collateral_index * amount_in_collateral_index
fc::variants get_objects(const vector< object_id_type > &ids, optional< bool > subscribe) const
boost::signals2::scoped_connection _removed_connection
extended_liquidity_pool_object extend_liquidity_pool(LP &&a, bool with_stats) const
const graphene::api_helper_indexes::next_object_ids_index * next_object_ids_index