78 if (delta.mpt().value() > room)
85 for (
auto& tx : lpAccepted->txs)
87 if (!tx.first || !tx.second || !tx.first->isFieldPresent(sfTransactionType))
91 uint16_t
const tt = tx.first->getFieldU16(sfTransactionType);
95 case ttOFFER_CREATE: {
96 if (tx.first->isFieldPresent(sfOfferSequence))
97 offerCancel = tx.first->getFieldU32(sfOfferSequence);
106 for (
auto const& node : tx.second->getFieldArray(sfAffectedNodes))
108 SField const& metaType = node.getFName();
109 uint16_t
const nodeType = node.getFieldU16(sfLedgerEntryType);
113 if (nodeType != ltOFFER || metaType == sfCreatedNode)
119 if (!node.isFieldPresent(sfFinalFields) || !node.isFieldPresent(sfPreviousFields))
122 auto const& ffBase = node.peekAtField(sfFinalFields);
123 auto const& finalFields = ffBase.template downcast<STObject>();
124 auto const& pfBase = node.peekAtField(sfPreviousFields);
125 auto const& previousFields = pfBase.template downcast<STObject>();
128 if (!finalFields.isFieldPresent(sfTakerGets) ||
129 !finalFields.isFieldPresent(sfTakerPays) ||
130 !previousFields.isFieldPresent(sfTakerGets) ||
131 !previousFields.isFieldPresent(sfTakerPays))
135 if (metaType == sfDeletedNode && offerCancel &&
136 finalFields.getFieldU32(sfSequence) == *offerCancel)
141 STAmount const deltaGets = finalFields.getFieldAmount(sfTakerGets) -
142 previousFields.getFieldAmount(sfTakerGets);
143 STAmount const deltaPays = finalFields.getFieldAmount(sfTakerPays) -
144 previousFields.getFieldAmount(sfTakerPays);
149 bool const noswap =
isXRP(deltaGets) || (!
isXRP(deltaPays) && (g < p));
151 STAmount first = noswap ? deltaGets : deltaPays;
152 STAmount second = noswap ? deltaPays : deltaGets;
189 if (!tally.contains(key))
203 auto& entry = tally[key];
210 if (!checkedAdd(volA, first) || !checkedAdd(volB, second))
212 std::get<0>(entry) = volA;
213 std::get<1>(entry) = volB;
215 if (std::get<2>(entry) < rate)
216 std::get<2>(entry) = rate;
218 if (std::get<3>(entry) > rate)
219 std::get<3>(entry) = rate;
221 std::get<5>(entry) = rate;
222 std::get<6>(entry) = domain;
228 jvObj[jss::type] =
"bookChanges";
231 jvObj[jss::validated] = lpAccepted->header().validated;
232 jvObj[jss::ledger_index] = lpAccepted->header().seq;
233 jvObj[jss::ledger_hash] =
to_string(lpAccepted->header().hash);
234 jvObj[jss::ledger_time] =
239 auto volToStr = [](
STAmount const& vol) {
240 return vol.asset().visit(
241 [&](
Issue const& issue) {
249 for (
auto const& entry : tally)
253 STAmount const volA = std::get<0>(entry.second);
254 STAmount const volB = std::get<1>(entry.second);
268 inner[jss::volume_a] = volToStr(volA);
269 inner[jss::volume_b] = volToStr(volB);
271 inner[jss::high] =
to_string(std::get<2>(entry.second).iou());
272 inner[jss::low] =
to_string(std::get<3>(entry.second).iou());
273 inner[jss::open] =
to_string(std::get<4>(entry.second).iou());
274 inner[jss::close] =
to_string(std::get<5>(entry.second).iou());