BitShares-Core  7.0.2
BitShares blockchain node software and command-line wallet software
market_object.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015 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 <graphene/chain/types.hpp>
30 
31 #include <boost/multi_index/composite_key.hpp>
32 
33 namespace graphene { namespace chain {
34 
35 using namespace graphene::db;
36 
45 class limit_order_object : public abstract_object<limit_order_object, protocol_ids, limit_order_object_type>
46 {
47  public:
49  account_id_type seller;
52  fc::uint128_t filled_amount = 0;
55  bool is_settled_debt = false;
56 
58  vector< limit_order_auto_action > on_fill;
59 
62 
65  {
66  FC_ASSERT( !on_fill.empty() ); // Normally it should not fail // GCOVR_EXCL_LINE
67  return on_fill.front().get<create_take_profit_order_action>();
68  }
69 
70  pair<asset_id_type,asset_id_type> get_market()const
71  {
72  auto tmp = std::make_pair( sell_price.base.asset_id, sell_price.quote.asset_id );
73  if( tmp.first > tmp.second ) std::swap( tmp.first, tmp.second );
74  return tmp;
75  }
76 
77  asset amount_for_sale()const { return asset( for_sale, sell_price.base.asset_id ); }
78  asset amount_to_receive()const { return amount_for_sale() * sell_price; }
79  asset_id_type sell_asset_id()const { return sell_price.base.asset_id; }
80  asset_id_type receive_asset_id()const { return sell_price.quote.asset_id; }
81 };
82 
83 struct by_price;
84 struct by_expiration;
85 struct by_account;
86 struct by_account_price;
87 struct by_is_settled_debt;
88 typedef multi_index_container<
90  indexed_by<
91  ordered_unique< tag<by_id>, member< object, object_id_type, &object::id > >,
92  ordered_unique< tag<by_expiration>,
93  composite_key< limit_order_object,
94  member< limit_order_object, time_point_sec, &limit_order_object::expiration>,
95  member< object, object_id_type, &object::id>
96  >
97  >,
98  ordered_unique< tag<by_price>,
99  composite_key< limit_order_object,
100  member< limit_order_object, price, &limit_order_object::sell_price>,
101  member< object, object_id_type, &object::id>
102  >,
103  composite_key_compare< std::greater<price>, std::less<object_id_type> >
104  >,
105  ordered_unique< tag<by_is_settled_debt>,
106  composite_key< limit_order_object,
107  member< limit_order_object, bool, &limit_order_object::is_settled_debt >,
108  const_mem_fun< limit_order_object, asset_id_type, &limit_order_object::receive_asset_id >,
109  member< object, object_id_type, &object::id>
110  >
111  >,
112  // index used by APIs
113  ordered_unique< tag<by_account>,
114  composite_key< limit_order_object,
115  member<limit_order_object, account_id_type, &limit_order_object::seller>,
116  member<object, object_id_type, &object::id>
117  >
118  >,
119  // index used by APIs
120  ordered_unique< tag<by_account_price>,
121  composite_key< limit_order_object,
122  member<limit_order_object, account_id_type, &limit_order_object::seller>,
123  member<limit_order_object, price, &limit_order_object::sell_price>,
124  member<object, object_id_type, &object::id>
125  >,
126  composite_key_compare<std::less<account_id_type>, std::greater<price>, std::less<object_id_type>>
127  >
128  >
130 
132 
140 class call_order_object : public abstract_object<call_order_object, protocol_ids, call_order_object_type>
141 {
142  public:
143  asset get_collateral()const { return asset( collateral, call_price.base.asset_id ); }
144  asset get_debt()const { return asset( debt, debt_type() ); }
145  asset amount_to_receive()const { return get_debt(); }
146  asset_id_type debt_type()const { return call_price.quote.asset_id; }
147  asset_id_type collateral_type()const { return call_price.base.asset_id; }
148  price collateralization()const { return get_collateral() / get_debt(); }
149 
150  account_id_type borrower;
154 
156 
157  pair<asset_id_type,asset_id_type> get_market()const
158  {
159  auto tmp = std::make_pair( call_price.base.asset_id, call_price.quote.asset_id );
160  if( tmp.first > tmp.second ) std::swap( tmp.first, tmp.second );
161  return tmp;
162  }
163 
174  share_type get_max_debt_to_cover( price match_price,
175  price feed_price,
176  const uint16_t maintenance_collateral_ratio,
177  const optional<price>& maintenance_collateralization = optional<price>()
178  )const;
179 };
180 
187 class force_settlement_object : public abstract_object<force_settlement_object,
188  protocol_ids, force_settlement_object_type>
189 {
190  public:
191  account_id_type owner;
194 
195  asset_id_type settlement_asset_id()const
196  { return balance.asset_id; }
197 };
198 
206 class collateral_bid_object : public abstract_object<collateral_bid_object,
207  implementation_ids, impl_collateral_bid_object_type>
208 {
209  public:
210  asset get_additional_collateral()const { return inv_swan_price.base; }
211  asset get_debt_covered()const { return inv_swan_price.quote; }
212  asset_id_type debt_type()const { return inv_swan_price.quote.asset_id; }
213 
214  account_id_type bidder;
215  price inv_swan_price; // Collateral / Debt
216 };
217 
218 struct by_collateral;
219 struct by_account;
220 struct by_price;
221 typedef multi_index_container<
223  indexed_by<
224  ordered_unique< tag<by_id>,
225  member< object, object_id_type, &object::id > >,
226  ordered_unique< tag<by_price>,
227  composite_key< call_order_object,
228  member< call_order_object, price, &call_order_object::call_price>,
229  member< object, object_id_type, &object::id>
230  >,
231  composite_key_compare< std::less<price>, std::less<object_id_type> >
232  >,
233  ordered_unique< tag<by_account>,
234  composite_key< call_order_object,
235  member< call_order_object, account_id_type, &call_order_object::borrower >,
236  const_mem_fun< call_order_object, asset_id_type, &call_order_object::debt_type>
237  >
238  >,
239  ordered_unique< tag<by_collateral>,
240  composite_key< call_order_object,
241  const_mem_fun< call_order_object, price, &call_order_object::collateralization >,
242  member< object, object_id_type, &object::id >
243  >
244  >
245  >
247 
249 typedef multi_index_container<
251  indexed_by<
252  ordered_unique< tag<by_id>, member< object, object_id_type, &object::id > >,
253  ordered_unique< tag<by_account>,
254  composite_key< force_settlement_object,
255  member<force_settlement_object, account_id_type, &force_settlement_object::owner>,
256  member< object, object_id_type, &object::id >
257  >
258  >,
259  ordered_unique< tag<by_expiration>,
260  composite_key< force_settlement_object,
261  const_mem_fun<force_settlement_object, asset_id_type, &force_settlement_object::settlement_asset_id>,
262  member<force_settlement_object, time_point_sec, &force_settlement_object::settlement_date>,
263  member< object, object_id_type, &object::id >
264  >
265  >
266  >
268 
269 typedef multi_index_container<
271  indexed_by<
272  ordered_unique< tag<by_id>,
273  member< object, object_id_type, &object::id > >,
274  ordered_unique< tag<by_account>,
275  composite_key< collateral_bid_object,
276  const_mem_fun< collateral_bid_object, asset_id_type, &collateral_bid_object::debt_type>,
277  member< collateral_bid_object, account_id_type, &collateral_bid_object::bidder>
278  >
279  >,
280  ordered_unique< tag<by_price>,
281  composite_key< collateral_bid_object,
282  const_mem_fun< collateral_bid_object, asset_id_type, &collateral_bid_object::debt_type>,
283  member< collateral_bid_object, price, &collateral_bid_object::inv_swan_price >,
284  member< object, object_id_type, &object::id >
285  >,
286  composite_key_compare< std::less<asset_id_type>, std::greater<price>, std::less<object_id_type> >
287  >
288  >
290 
294 
295 } } // graphene::chain
296 
301 
306 
graphene::chain::force_settlement_object::owner
account_id_type owner
Definition: market_object.hpp:191
graphene::chain::limit_order_object::amount_to_receive
asset amount_to_receive() const
Definition: market_object.hpp:78
graphene::chain::limit_order_object::sell_price
price sell_price
The seller's asking price.
Definition: market_object.hpp:51
graphene::chain::collateral_bid_object::get_additional_collateral
asset get_additional_collateral() const
Definition: market_object.hpp:210
graphene::chain::call_order_object::debt
share_type debt
call_price.quote.asset_id, access via get_debt
Definition: market_object.hpp:152
graphene::chain::limit_order_index
generic_index< limit_order_object, limit_order_multi_index_type > limit_order_index
Definition: market_object.hpp:131
graphene::chain::collateral_bid_index
generic_index< collateral_bid_object, collateral_bid_object_multi_index_type > collateral_bid_index
Definition: market_object.hpp:293
graphene::protocol::price
The price struct stores asset prices in the BitShares system.
Definition: asset.hpp:108
FC_REFLECT_TYPENAME
FC_REFLECT_TYPENAME(fc::log_message)
graphene::protocol::create_take_profit_order_action
Definition: market.hpp:33
graphene::chain::call_order_object::collateral_type
asset_id_type collateral_type() const
Definition: market_object.hpp:147
graphene::chain::force_settlement_object_multi_index_type
multi_index_container< force_settlement_object, indexed_by< ordered_unique< tag< by_id >, member< object, object_id_type, &object::id > >, ordered_unique< tag< by_account >, composite_key< force_settlement_object, member< force_settlement_object, account_id_type, &force_settlement_object::owner >, member< object, object_id_type, &object::id > > >, ordered_unique< tag< by_expiration >, composite_key< force_settlement_object, const_mem_fun< force_settlement_object, asset_id_type, &force_settlement_object::settlement_asset_id >, member< force_settlement_object, time_point_sec, &force_settlement_object::settlement_date >, member< object, object_id_type, &object::id > > > >> force_settlement_object_multi_index_type
Definition: market_object.hpp:248
graphene::chain::call_order_object::get_collateral
asset get_collateral() const
Definition: market_object.hpp:143
graphene::chain::limit_order_object::on_fill
vector< limit_order_auto_action > on_fill
Automatic actions when the limit order is filled or partially filled.
Definition: market_object.hpp:58
graphene::chain::call_order_object::collateralization
price collateralization() const
Definition: market_object.hpp:148
generic_index.hpp
MAP_OBJECT_ID_TO_TYPE
#define MAP_OBJECT_ID_TO_TYPE(OBJECT)
Definition: object_id.hpp:93
graphene::chain::limit_order_object::sell_asset_id
asset_id_type sell_asset_id() const
Definition: market_object.hpp:79
graphene::chain::limit_order_object::get_market
pair< asset_id_type, asset_id_type > get_market() const
Definition: market_object.hpp:70
graphene::chain::call_order_object::get_debt
asset get_debt() const
Definition: market_object.hpp:144
graphene::chain::call_order_object::collateral
share_type collateral
call_price.base.asset_id, access via get_collateral
Definition: market_object.hpp:151
graphene::chain::limit_order_object::seller
account_id_type seller
Who is selling.
Definition: market_object.hpp:49
graphene::db::abstract_object
Definition: object.hpp:107
graphene::chain::call_order_object::debt_type
asset_id_type debt_type() const
Definition: market_object.hpp:146
graphene::chain::collateral_bid_object_multi_index_type
multi_index_container< collateral_bid_object, indexed_by< ordered_unique< tag< by_id >, member< object, object_id_type, &object::id > >, ordered_unique< tag< by_account >, composite_key< collateral_bid_object, const_mem_fun< collateral_bid_object, asset_id_type, &collateral_bid_object::debt_type >, member< collateral_bid_object, account_id_type, &collateral_bid_object::bidder > > >, ordered_unique< tag< by_price >, composite_key< collateral_bid_object, const_mem_fun< collateral_bid_object, asset_id_type, &collateral_bid_object::debt_type >, member< collateral_bid_object, price, &collateral_bid_object::inv_swan_price >, member< object, object_id_type, &object::id > >, composite_key_compare< std::less< asset_id_type >, std::greater< price >, std::less< object_id_type > > > >> collateral_bid_object_multi_index_type
Definition: market_object.hpp:289
graphene::chain::call_order_object::target_collateral_ratio
optional< uint16_t > target_collateral_ratio
maximum CR to maintain when selling collateral on margin call
Definition: market_object.hpp:155
graphene::chain::force_settlement_index
generic_index< force_settlement_object, force_settlement_object_multi_index_type > force_settlement_index
Definition: market_object.hpp:292
graphene::chain::limit_order_object::for_sale
share_type for_sale
The amount for sale, asset id is sell_price.base.asset_id.
Definition: market_object.hpp:50
graphene::chain::limit_order_object::expiration
time_point_sec expiration
When this limit order will expire.
Definition: market_object.hpp:48
graphene::chain::call_order_object::get_market
pair< asset_id_type, asset_id_type > get_market() const
Definition: market_object.hpp:157
graphene::chain::force_settlement_object::settlement_date
time_point_sec settlement_date
Definition: market_object.hpp:193
fc::time_point_sec
Definition: time.hpp:74
graphene::protocol::asset::asset_id
asset_id_type asset_id
Definition: asset.hpp:37
graphene::chain::by_expiration
Definition: proposal_object.hpp:86
graphene::chain::call_order_index
generic_index< call_order_object, call_order_multi_index_type > call_order_index
Definition: market_object.hpp:291
graphene::chain::limit_order_object::receive_asset_id
asset_id_type receive_asset_id() const
Definition: market_object.hpp:80
graphene::chain::force_settlement_object::balance
asset balance
Definition: market_object.hpp:192
GRAPHENE_DECLARE_EXTERNAL_SERIALIZATION
#define GRAPHENE_DECLARE_EXTERNAL_SERIALIZATION(type)
Definition: types.hpp:85
graphene::chain::collateral_bid_object
bids of collateral for debt after a black swan
Definition: market_object.hpp:206
graphene::chain::call_order_object::call_price
price call_price
Collateral / Debt.
Definition: market_object.hpp:153
graphene::chain::collateral_bid_object::bidder
account_id_type bidder
Definition: market_object.hpp:214
graphene::chain::collateral_bid_object::debt_type
asset_id_type debt_type() const
Definition: market_object.hpp:212
graphene::chain::call_order_object::borrower
account_id_type borrower
Definition: market_object.hpp:150
FC_ASSERT
#define FC_ASSERT(TEST,...)
Checks a condition and throws an assert_exception if the test is FALSE.
Definition: exception.hpp:345
graphene::chain::limit_order_object::get_take_profit_action
const create_take_profit_order_action & get_take_profit_action() const
Returns the configured automatic action that will create a take profit order when this limit order is...
Definition: market_object.hpp:64
market.hpp
graphene::chain::limit_order_object::amount_for_sale
asset amount_for_sale() const
Definition: market_object.hpp:77
graphene::chain::force_settlement_object
tracks bitassets scheduled for force settlement at some point in the future.
Definition: market_object.hpp:187
types.hpp
graphene::chain::call_order_object
tracks debt and call price information
Definition: market_object.hpp:140
graphene::protocol::price::base
asset base
Definition: asset.hpp:113
graphene::db::generic_index
Definition: generic_index.hpp:43
fc::optional
provides stack-based nullable value similar to boost::optional
Definition: optional.hpp:20
graphene::chain::limit_order_object::take_profit_order_id
optional< limit_order_id_type > take_profit_order_id
ID of the take profit limit order linked to this limit order.
Definition: market_object.hpp:61
graphene::chain::call_order_multi_index_type
multi_index_container< call_order_object, indexed_by< ordered_unique< tag< by_id >, member< object, object_id_type, &object::id > >, ordered_unique< tag< by_price >, composite_key< call_order_object, member< call_order_object, price, &call_order_object::call_price >, member< object, object_id_type, &object::id > >, composite_key_compare< std::less< price >, std::less< object_id_type > > >, ordered_unique< tag< by_account >, composite_key< call_order_object, member< call_order_object, account_id_type, &call_order_object::borrower >, const_mem_fun< call_order_object, asset_id_type, &call_order_object::debt_type > > >, ordered_unique< tag< by_collateral >, composite_key< call_order_object, const_mem_fun< call_order_object, price, &call_order_object::collateralization >, member< object, object_id_type, &object::id > > > >> call_order_multi_index_type
Definition: market_object.hpp:220
graphene::chain::call_order_object::amount_to_receive
asset amount_to_receive() const
Definition: market_object.hpp:145
graphene::protocol::asset
Definition: asset.hpp:31
graphene::db
Definition: generic_index.hpp:31
asset.hpp
graphene::chain::limit_order_multi_index_type
multi_index_container< limit_order_object, indexed_by< ordered_unique< tag< by_id >, member< object, object_id_type, &object::id > >, ordered_unique< tag< by_expiration >, composite_key< limit_order_object, member< limit_order_object, time_point_sec, &limit_order_object::expiration >, member< object, object_id_type, &object::id > > >, ordered_unique< tag< by_price >, composite_key< limit_order_object, member< limit_order_object, price, &limit_order_object::sell_price >, member< object, object_id_type, &object::id > >, composite_key_compare< std::greater< price >, std::less< object_id_type > > >, ordered_unique< tag< by_is_settled_debt >, composite_key< limit_order_object, member< limit_order_object, bool, &limit_order_object::is_settled_debt >, const_mem_fun< limit_order_object, asset_id_type, &limit_order_object::receive_asset_id >, member< object, object_id_type, &object::id > > >, ordered_unique< tag< by_account >, composite_key< limit_order_object, member< limit_order_object, account_id_type, &limit_order_object::seller >, member< object, object_id_type, &object::id > > >, ordered_unique< tag< by_account_price >, composite_key< limit_order_object, member< limit_order_object, account_id_type, &limit_order_object::seller >, member< limit_order_object, price, &limit_order_object::sell_price >, member< object, object_id_type, &object::id > >, composite_key_compare< std::less< account_id_type >, std::greater< price >, std::less< object_id_type > > > >> limit_order_multi_index_type
Definition: market_object.hpp:87
graphene::chain::limit_order_object
an offer to sell an amount of an asset at a specified exchange rate by a certain time
Definition: market_object.hpp:45
graphene::chain::limit_order_object::deferred_paid_fee
asset deferred_paid_fee
originally paid fee
Definition: market_object.hpp:54
graphene::chain::limit_order_object::deferred_fee
share_type deferred_fee
fee converted to CORE
Definition: market_object.hpp:53
graphene::protocol::price::quote
asset quote
Definition: asset.hpp:114
graphene
Definition: api.cpp:48
graphene::chain::collateral_bid_object::get_debt_covered
asset get_debt_covered() const
Definition: market_object.hpp:211
graphene::chain::force_settlement_object::settlement_asset_id
asset_id_type settlement_asset_id() const
Definition: market_object.hpp:195
graphene::chain::collateral_bid_object::inv_swan_price
price inv_swan_price
Definition: market_object.hpp:215
fc::safe
Definition: safe.hpp:26