From e7f0b8eca69dd47419eee7b82c8716b3aa5a9e39 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 20 Jan 2014 18:14:33 -0800 Subject: [PATCH] Add DeliveredAmount to transaction metadata --- src/ripple_app/ledger/LedgerEntrySet.cpp | 2 +- src/ripple_app/ledger/LedgerEntrySet.h | 5 +++++ src/ripple_app/tx/PaymentTransactor.cpp | 7 +++++-- src/ripple_app/tx/TransactionMeta.cpp | 6 ++++++ src/ripple_app/tx/TransactionMeta.h | 18 ++++++++++++++++++ .../protocol/SerializeDeclarations.h | 1 + 6 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/ripple_app/ledger/LedgerEntrySet.cpp b/src/ripple_app/ledger/LedgerEntrySet.cpp index 7c02cf6dc..39ce90059 100644 --- a/src/ripple_app/ledger/LedgerEntrySet.cpp +++ b/src/ripple_app/ledger/LedgerEntrySet.cpp @@ -592,7 +592,7 @@ void LedgerEntrySet::calcRawMeta (Serializer& s, TER result, uint32 index) // add any new modified nodes to the modification set typedef std::map::value_type u256_sle_pair; BOOST_FOREACH (u256_sle_pair & it, newMod) - entryModify (it.second); + entryModify (it.second); mSet.addRaw (s, result, index); WriteLog (lsTRACE, LedgerEntrySet) << "Metadata:" << mSet.getJson (0); diff --git a/src/ripple_app/ledger/LedgerEntrySet.h b/src/ripple_app/ledger/LedgerEntrySet.h index ea203e643..372c1b180 100644 --- a/src/ripple_app/ledger/LedgerEntrySet.h +++ b/src/ripple_app/ledger/LedgerEntrySet.h @@ -246,6 +246,11 @@ public: return mEntries.end (); } + void setDeliveredAmount (STAmount const& amt) + { + mSet.setDeliveredAmount (amt); + } + private: Ledger::pointer mLedger; std::map mEntries; // cannot be unordered! diff --git a/src/ripple_app/tx/PaymentTransactor.cpp b/src/ripple_app/tx/PaymentTransactor.cpp index 1673c556c..1d6117449 100644 --- a/src/ripple_app/tx/PaymentTransactor.cpp +++ b/src/ripple_app/tx/PaymentTransactor.cpp @@ -204,8 +204,11 @@ TER PaymentTransactor::doApply () false, // Not standalone, delete unfundeds. isSetBit (mParams, tapOPEN_LEDGER)); - if (terNO_LINE == terResult) - terResult = tecPATH_DRY; + if (terNO_LINE == terResult) + terResult = tecPATH_DRY; + + if ((tesSUCCESS == terResult) && (saDstAmountAct != saDstAmount)) + mEngine->getNodes().setDeliveredAmount (saDstAmountAct); } catch (const std::exception& e) { diff --git a/src/ripple_app/tx/TransactionMeta.cpp b/src/ripple_app/tx/TransactionMeta.cpp index e680ccefd..7de60a872 100644 --- a/src/ripple_app/tx/TransactionMeta.cpp +++ b/src/ripple_app/tx/TransactionMeta.cpp @@ -36,6 +36,9 @@ TransactionMetaSet::TransactionMetaSet (uint256 const& txid, uint32 ledger, Blob mResult = obj->getFieldU8 (sfTransactionResult); mIndex = obj->getFieldU32 (sfTransactionIndex); mNodes = * dynamic_cast (&obj->getField (sfAffectedNodes)); + + if (obj->isFieldPresent (sfDeliveredAmount)) + setDeliveredAmount (obj->getFieldAmount (sfDeliveredAmount)); } bool TransactionMetaSet::isNodeAffected (uint256 const& node) const @@ -177,6 +180,7 @@ void TransactionMetaSet::init (uint256 const& id, uint32 ledger) mTransactionID = id; mLedger = ledger; mNodes = STArray (sfAffectedNodes, 32); + mDelivered = boost::optional (); } void TransactionMetaSet::swap (TransactionMetaSet& s) @@ -212,6 +216,8 @@ STObject TransactionMetaSet::getAsObject () const metaData.setFieldU8 (sfTransactionResult, mResult); metaData.setFieldU32 (sfTransactionIndex, mIndex); metaData.addObject (mNodes); + if (hasDeliveredAmount ()) + metaData.setFieldAmount (sfDeliveredAmount, getDeliveredAmount ()); return metaData; } diff --git a/src/ripple_app/tx/TransactionMeta.h b/src/ripple_app/tx/TransactionMeta.h index 1e3bfb908..5ed8eb563 100644 --- a/src/ripple_app/tx/TransactionMeta.h +++ b/src/ripple_app/tx/TransactionMeta.h @@ -86,6 +86,22 @@ public: return (mNodes); } + void setDeliveredAmount (STAmount const& delivered) + { + mDelivered.reset (delivered); + } + + STAmount getDeliveredAmount () const + { + assert (hasDeliveredAmount ()); + return *mDelivered; + } + + bool hasDeliveredAmount () const + { + return mDelivered; + } + static bool thread (STObject& node, uint256 const& prevTxID, uint32 prevLgrID); private: @@ -94,6 +110,8 @@ private: uint32 mIndex; int mResult; + boost::optional mDelivered; + STArray mNodes; }; diff --git a/src/ripple_data/protocol/SerializeDeclarations.h b/src/ripple_data/protocol/SerializeDeclarations.h index 5a1008a26..14d2de12a 100644 --- a/src/ripple_data/protocol/SerializeDeclarations.h +++ b/src/ripple_data/protocol/SerializeDeclarations.h @@ -146,6 +146,7 @@ FIELD (SendMax, AMOUNT, 9) // currency amount (uncommon) FIELD (MinimumOffer, AMOUNT, 16) FIELD (RippleEscrow, AMOUNT, 17) +FIELD (DeliveredAmount, AMOUNT, 18) // variable length FIELD (PublicKey, VL, 1)