From ce2cecf0464a17d54876523b43815bf5e355fcfa Mon Sep 17 00:00:00 2001 From: Miguel Portilla Date: Mon, 21 Jul 2014 13:09:33 -0400 Subject: [PATCH] Add owner_funds to client subscription data (RIPD-377) Conflicts: src/ripple/module/app/ledger/AcceptedLedger.cpp --- src/ripple/common/jsonrpc_fields.h | 1 + .../module/app/ledger/AcceptedLedger.cpp | 3 +- .../module/app/ledger/AcceptedLedgerTx.cpp | 37 ++++++++++++++++--- .../module/app/ledger/AcceptedLedgerTx.h | 8 ++-- src/ripple/module/app/misc/NetworkOPs.cpp | 16 ++++---- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/ripple/common/jsonrpc_fields.h b/src/ripple/common/jsonrpc_fields.h index c923c2177..632999731 100644 --- a/src/ripple/common/jsonrpc_fields.h +++ b/src/ripple/common/jsonrpc_fields.h @@ -111,6 +111,7 @@ JSS ( none ); JSS ( no_ripple ); JSS ( no_ripple_peer ); JSS ( offers ); +JSS ( owner_funds ); JSS ( params ); JSS ( parent_hash ); JSS ( peer ); diff --git a/src/ripple/module/app/ledger/AcceptedLedger.cpp b/src/ripple/module/app/ledger/AcceptedLedger.cpp index 3778d94fb..a9aeeb220 100644 --- a/src/ripple/module/app/ledger/AcceptedLedger.cpp +++ b/src/ripple/module/app/ledger/AcceptedLedger.cpp @@ -34,8 +34,7 @@ AcceptedLedger::AcceptedLedger (Ledger::ref ledger) : mLedger (ledger) item = txSet.peekNextItem (item->getTag ())) { SerializerIterator sit (item->peekSerializer ()); - insert (std::make_shared ( - ledger->getLedgerSeq (), sit)); + insert (std::make_shared (ledger, std::ref (sit))); } } diff --git a/src/ripple/module/app/ledger/AcceptedLedgerTx.cpp b/src/ripple/module/app/ledger/AcceptedLedgerTx.cpp index 7f91dcfa4..f0fc80ef9 100644 --- a/src/ripple/module/app/ledger/AcceptedLedgerTx.cpp +++ b/src/ripple/module/app/ledger/AcceptedLedgerTx.cpp @@ -19,28 +19,38 @@ namespace ripple { -AcceptedLedgerTx::AcceptedLedgerTx (std::uint32_t seq, SerializerIterator& sit) +AcceptedLedgerTx::AcceptedLedgerTx (Ledger::ref ledger, SerializerIterator& sit) + : mLedger (ledger) { Serializer txnSer (sit.getVL ()); SerializerIterator txnIt (txnSer); mTxn = std::make_shared (std::ref (txnIt)); mRawMeta = sit.getVL (); - mMeta = std::make_shared (mTxn->getTransactionID (), seq, mRawMeta); + mMeta = std::make_shared (mTxn->getTransactionID (), + ledger->getLedgerSeq (), mRawMeta); mAffected = mMeta->getAffectedAccounts (); mResult = mMeta->getResultTER (); buildJson (); } -AcceptedLedgerTx::AcceptedLedgerTx (SerializedTransaction::ref txn, TransactionMetaSet::ref met) : - mTxn (txn), mMeta (met), mAffected (met->getAffectedAccounts ()) +AcceptedLedgerTx::AcceptedLedgerTx (Ledger::ref ledger, + SerializedTransaction::ref txn, TransactionMetaSet::ref met) + : mLedger (ledger) + , mTxn (txn) + , mMeta (met) + , mAffected (met->getAffectedAccounts ()) { mResult = mMeta->getResultTER (); buildJson (); } -AcceptedLedgerTx::AcceptedLedgerTx (SerializedTransaction::ref txn, TER result) : - mTxn (txn), mResult (result), mAffected (txn->getMentionedAccounts ()) +AcceptedLedgerTx::AcceptedLedgerTx (Ledger::ref ledger, + SerializedTransaction::ref txn, TER result) + : mLedger (ledger) + , mTxn (txn) + , mResult (result) + , mAffected (txn->getMentionedAccounts ()) { buildJson (); } @@ -71,6 +81,21 @@ void AcceptedLedgerTx::buildJson () { affected.append (ra.humanAccountID ()); } + } + + if (mTxn->getTxnType () == ttOFFER_CREATE) + { + auto const account (mTxn->getSourceAccount ().getAccountID ()); + auto const amount (mTxn->getFieldAmount (sfTakerGets)); + + // If the offer create is not self funded then add the owner balance + if (account != amount.issue ().account) + { + LedgerEntrySet les (mLedger, tapNONE, true); + auto const ownerFunds (les.accountFunds (account, amount, fhIGNORE_FREEZE)); + + mJson[jss::owner_funds] = ownerFunds.getText (); + } } } diff --git a/src/ripple/module/app/ledger/AcceptedLedgerTx.h b/src/ripple/module/app/ledger/AcceptedLedgerTx.h index cdc504cf7..a17966d18 100644 --- a/src/ripple/module/app/ledger/AcceptedLedgerTx.h +++ b/src/ripple/module/app/ledger/AcceptedLedgerTx.h @@ -48,9 +48,10 @@ public: typedef const pointer& ref; public: - AcceptedLedgerTx (LedgerIndex ledgerSeq, SerializerIterator& sit); - AcceptedLedgerTx (SerializedTransaction::ref, TransactionMetaSet::ref); - AcceptedLedgerTx (SerializedTransaction::ref, TER result); + AcceptedLedgerTx (Ledger::ref ledger, SerializerIterator& sit); + AcceptedLedgerTx (Ledger::ref ledger, SerializedTransaction::ref, + TransactionMetaSet::ref); + AcceptedLedgerTx (Ledger::ref ledger, SerializedTransaction::ref, TER result); SerializedTransaction::ref getTxn () const { @@ -97,6 +98,7 @@ public: } private: + Ledger::pointer mLedger; SerializedTransaction::pointer mTxn; TransactionMetaSet::pointer mMeta; TER mResult; diff --git a/src/ripple/module/app/misc/NetworkOPs.cpp b/src/ripple/module/app/misc/NetworkOPs.cpp index 3697ccc2c..2bd935325 100644 --- a/src/ripple/module/app/misc/NetworkOPs.cpp +++ b/src/ripple/module/app/misc/NetworkOPs.cpp @@ -2546,7 +2546,7 @@ void NetworkOPsImp::pubProposedTransaction ( } } } - AcceptedLedgerTx alt (stTxn, terResult); + AcceptedLedgerTx alt (lpCurrent, stTxn, terResult); m_journal.trace << "pubProposed: " << alt.getJson (); pubAccountTransaction (lpCurrent, alt, false); } @@ -3133,6 +3133,7 @@ void NetworkOPsImp::getBookPage ( auto const& saTakerPays = sleOffer->getFieldAmount (sfTakerPays); STAmount saOwnerFunds; + bool firstOwnerOffer (true); if (book.out.account == uOfferOwnerID) { @@ -3154,6 +3155,7 @@ void NetworkOPsImp::getBookPage ( // Found in running balance table. saOwnerFunds = umBalanceEntry->second; + firstOwnerOffer = false; } else { @@ -3227,12 +3229,12 @@ void NetworkOPsImp::getBookPage ( umBalance[uOfferOwnerID] = saOwnerFunds - saOwnerPays; - if (saOwnerFunds != zero || uOfferOwnerID == uTakerID) - { - // Only provide funded offers and offers of the taker. - Json::Value& jvOf = jvOffers.append (jvOffer); - jvOf[jss::quality] = saDirRate.getText (); - } + // Include all offers funded and unfunded + Json::Value& jvOf = jvOffers.append (jvOffer); + jvOf[jss::quality] = saDirRate.getText (); + + if (firstOwnerOffer) + jvOf[jss::owner_funds] = saOwnerFunds.getText (); } else {