20 #ifndef RIPPLE_RPC_BOOKCHANGES_H_INCLUDED
21 #define RIPPLE_RPC_BOOKCHANGES_H_INCLUDED
52 for (
auto& tx : lpAccepted->txs)
54 if (!tx.first || !tx.second ||
76 SField const& metaType = node.getFName();
92 auto const& finalFields = ffBase.template downcast<STObject>();
94 auto const& previousFields = pfBase.template downcast<STObject>();
105 finalFields.getFieldU32(
sfSequence) == *offerCancel)
119 isXRP(deltaGets) ? true : (
isXRP(deltaPays) ? false : (g < p));
121 STAmount first = noswap ? deltaGets : deltaPays;
122 STAmount second = noswap ? deltaPays : deltaGets;
125 if (second == beast::zero)
130 if (first < beast::zero)
133 if (second < beast::zero)
144 if (tally.find(key) == tally.end())
156 auto& entry = tally[key];
158 std::get<0>(entry) += first;
159 std::get<1>(entry) += second;
161 if (std::get<2>(entry) < rate)
162 std::get<2>(entry) = rate;
164 if (std::get<3>(entry) > rate)
165 std::get<3>(entry) = rate;
167 std::get<5>(entry) = rate;
173 jvObj[jss::type] =
"bookChanges";
174 jvObj[jss::ledger_index] = lpAccepted->info().seq;
175 jvObj[jss::ledger_hash] =
to_string(lpAccepted->info().hash);
177 lpAccepted->info().closeTime.time_since_epoch().count());
181 for (
auto const& entry : tally)
185 STAmount volA = std::get<0>(entry.second);
186 STAmount volB = std::get<1>(entry.second);
188 inner[jss::currency_a] =
190 inner[jss::currency_b] =
193 inner[jss::volume_a] =
195 inner[jss::volume_b] =
198 inner[jss::high] =
to_string(std::get<2>(entry.second).iou());
199 inner[jss::low] =
to_string(std::get<3>(entry.second).iou());
200 inner[jss::open] =
to_string(std::get<4>(entry.second).iou());
201 inner[jss::close] =
to_string(std::get<5>(entry.second).iou());