20#include <xrpld/app/ledger/LedgerMaster.h>
21#include <xrpld/app/ledger/OrderBookDB.h>
22#include <xrpld/app/main/Application.h>
23#include <xrpld/app/misc/AMMUtils.h>
24#include <xrpld/app/misc/NetworkOPs.h>
25#include <xrpld/core/Config.h>
26#include <xrpld/core/JobQueue.h>
28#include <xrpl/basics/Log.h>
29#include <xrpl/protocol/Indexes.h>
34 : app_(app), seq_(0), j_(app.journal(
"OrderBookDB"))
43 JLOG(
j_.
warn()) <<
"Eliding full order book update: no ledger";
51 if ((ledger->seq() >
seq) && ((ledger->seq() -
seq) < 25600))
54 if ((ledger->seq() <=
seq) && ((
seq - ledger->seq()) < 16))
61 JLOG(
j_.
debug()) <<
"Full order book update: " <<
seq <<
" to "
72 [
this, ledger]() { update(ledger); });
85 JLOG(
j_.
debug()) <<
"Eliding update for " << ledger->seq()
86 <<
" because of pending update to later " <<
seq;
96 JLOG(
j_.
debug()) <<
"Beginning update (" << ledger->seq() <<
")";
103 for (
auto& sle : ledger->sles)
108 <<
"Update halted because the process is stopping";
113 if (sle->getType() == ltDIR_NODE &&
114 sle->isFieldPresent(sfExchangeRate) &&
115 sle->getFieldH256(sfRootIndex) == sle->key())
119 book.
in.
currency = sle->getFieldH160(sfTakerPaysCurrency);
120 book.
in.
account = sle->getFieldH160(sfTakerPaysIssuer);
121 book.
out.
currency = sle->getFieldH160(sfTakerGetsCurrency);
122 book.
out.
account = sle->getFieldH160(sfTakerGetsIssuer);
124 allBooks[book.
in].insert(book.
out);
127 xrpBooks.insert(book.
in);
131 else if (sle->getType() == ltAMM)
133 auto const issue1 = (*sle)[sfAsset].get<
Issue>();
134 auto const issue2 = (*sle)[sfAsset2].get<
Issue>();
136 allBooks[
in].insert(
out);
143 addBook(issue1, issue2);
144 addBook(issue2, issue1);
150 JLOG(
j_.
info()) <<
"Missing node in " << ledger->seq()
151 <<
" during update: " << mn.
what();
156 JLOG(
j_.
debug()) <<
"Update completed (" << ledger->seq() <<
"): " << cnt
192 ret.
reserve(it->second.size());
194 for (
auto const& gets : it->second)
207 return static_cast<int>(it->second.size());
226 ret = std::make_shared<BookListeners>();
231 "ripple::OrderBookDB::makeBookListeners : result roundtrip lookup");
271 if (node.getFieldU16(sfLedgerEntryType) == ltOFFER)
273 auto process = [&,
this](
SField const& field) {
274 if (
auto data =
dynamic_cast<STObject const*
>(
275 node.peekAtPField(field));
276 data && data->isFieldPresent(sfTakerPays) &&
277 data->isFieldPresent(sfTakerGets))
280 {data->getFieldAmount(sfTakerGets).issue(),
281 data->getFieldAmount(sfTakerPays).issue()});
283 listeners->publish(jvObj, havePublished);
289 if (node.getFName() == sfModifiedNode)
290 process(sfPreviousFields);
291 else if (node.getFName() == sfCreatedNode)
292 process(sfNewFields);
293 else if (node.getFName() == sfDeletedNode)
294 process(sfFinalFields);
300 <<
"processTxn: field not found (" << ex.
what() <<
")";
A transaction that is in a closed ledger.
TxMeta const & getMeta() const
virtual Config & config()=0
virtual bool isStopping() const =0
virtual JobQueue & getJobQueue()=0
virtual NetworkOPs & getOPs()=0
virtual LedgerMaster & getLedgerMaster()=0
A currency issued by an account.
bool addJob(JobType type, std::string const &name, JobHandler &&jobHandler)
Adds a job to the JobQueue.
virtual bool isNeedNetworkLedger()=0
BookListeners::pointer getBookListeners(Book const &)
void addOrderBook(Book const &)
void processTxn(std::shared_ptr< ReadView const > const &ledger, AcceptedLedgerTx const &alTx, MultiApiJson const &jvObj)
bool isBookToXRP(Issue const &)
BookListeners::pointer makeBookListeners(Book const &)
std::atomic< std::uint32_t > seq_
OrderBookDB(Application &app)
std::vector< Book > getBooksByTakerPays(Issue const &)
void update(std::shared_ptr< ReadView const > const &ledger)
int getBookSize(Issue const &)
std::recursive_mutex mLock
BookToListenersMap mListeners
hash_set< Issue > xrpBooks_
hardened_hash_map< Issue, hardened_hash_set< Issue > > allBooks_
void setup(std::shared_ptr< ReadView const > const &ledger)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool isXRP(AccountID const &c)
Set the sequence number on a JTx.