From 436061be2216be08c325a1d60216868a544ca615 Mon Sep 17 00:00:00 2001 From: Nik Bougalis Date: Mon, 17 Mar 2014 13:33:11 -0700 Subject: [PATCH] Transactor journal support and small cleanups --- .../Builds/VisualStudio2013/beast.vcxproj | 1 - .../VisualStudio2013/beast.vcxproj.filters | 3 - src/ripple/sitefiles/impl/Manager.cpp | 4 +- .../transactors/AccountSetTransactor.cpp | 110 +++----- .../transactors/AccountSetTransactor.h | 31 ++- .../transactors/ChangeTransactor.cpp | 50 ++-- src/ripple_app/transactors/ChangeTransactor.h | 41 ++- .../transactors/OfferCancelTransactor.cpp | 60 ++-- .../transactors/OfferCancelTransactor.h | 31 ++- .../transactors/OfferCreateTransactor.cpp | 259 +++++++++--------- .../transactors/OfferCreateTransactor.h | 71 +++-- .../transactors/PaymentTransactor.cpp | 163 ++++++----- .../transactors/PaymentTransactor.h | 32 ++- .../transactors/RegularKeySetTransactor.cpp | 15 +- .../transactors/RegularKeySetTransactor.h | 34 ++- src/ripple_app/transactors/Transactor.h | 4 +- .../transactors/TrustSetTransactor.cpp | 142 +++++----- .../transactors/TrustSetTransactor.h | 28 +- .../transactors/WalletAddTransactor.cpp | 70 ++--- .../transactors/WalletAddTransactor.h | 28 +- 20 files changed, 692 insertions(+), 485 deletions(-) diff --git a/src/beast/Builds/VisualStudio2013/beast.vcxproj b/src/beast/Builds/VisualStudio2013/beast.vcxproj index 84262d098..8384d49f6 100644 --- a/src/beast/Builds/VisualStudio2013/beast.vcxproj +++ b/src/beast/Builds/VisualStudio2013/beast.vcxproj @@ -295,7 +295,6 @@ - diff --git a/src/beast/Builds/VisualStudio2013/beast.vcxproj.filters b/src/beast/Builds/VisualStudio2013/beast.vcxproj.filters index 91a7c3470..b80da828c 100644 --- a/src/beast/Builds/VisualStudio2013/beast.vcxproj.filters +++ b/src/beast/Builds/VisualStudio2013/beast.vcxproj.filters @@ -404,9 +404,6 @@ beast_core\time - - beast_core\diagnostic - beast_core\files diff --git a/src/ripple/sitefiles/impl/Manager.cpp b/src/ripple/sitefiles/impl/Manager.cpp index 1013dd2d7..620d8afd0 100644 --- a/src/ripple/sitefiles/impl/Manager.cpp +++ b/src/ripple/sitefiles/impl/Manager.cpp @@ -129,8 +129,8 @@ public: //------------------------------------------------------------------------------ Manager::Manager (Stoppable& parent) - : Stoppable ("PeerFinder", parent) - , beast::PropertyStream::Source ("peerfinder") + : Stoppable ("SiteFiles", parent) + , beast::PropertyStream::Source ("sitefiles") { } diff --git a/src/ripple_app/transactors/AccountSetTransactor.cpp b/src/ripple_app/transactors/AccountSetTransactor.cpp index 056dff3fd..d75afd714 100644 --- a/src/ripple_app/transactors/AccountSetTransactor.cpp +++ b/src/ripple_app/transactors/AccountSetTransactor.cpp @@ -19,32 +19,27 @@ namespace ripple { -SETUP_LOG (AccountSetTransactor) - TER AccountSetTransactor::doApply () { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet>"; + std::uint32_t const uTxFlags = mTxn.getFlags (); - const std::uint32_t uTxFlags = mTxn.getFlags (); + std::uint32_t const uFlagsIn = mTxnAccount->getFieldU32 (sfFlags); + std::uint32_t uFlagsOut = uFlagsIn; - const std::uint32_t uFlagsIn = mTxnAccount->getFieldU32 (sfFlags); - std::uint32_t uFlagsOut = uFlagsIn; - - const std::uint32_t uSetFlag = mTxn.getFieldU32 (sfSetFlag); - const std::uint32_t uClearFlag = mTxn.getFieldU32 (sfClearFlag); + std::uint32_t const uSetFlag = mTxn.getFieldU32 (sfSetFlag); + std::uint32_t const uClearFlag = mTxn.getFieldU32 (sfClearFlag); // legacy AccountSet flags - bool bSetRequireDest = (uTxFlags & TxFlag::requireDestTag) || (uSetFlag == asfRequireDest); - bool bClearRequireDest = (uTxFlags & tfOptionalDestTag) || (uClearFlag == asfRequireDest); - bool bSetRequireAuth = (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth); - bool bClearRequireAuth = (uTxFlags & tfOptionalAuth) || (uClearFlag == asfRequireAuth); - bool bSetDisallowXRP = (uTxFlags & tfDisallowXRP) || (uSetFlag == asfDisallowXRP); - bool bClearDisallowXRP = (uTxFlags & tfAllowXRP) || (uClearFlag == asfDisallowXRP); + bool bSetRequireDest = (uTxFlags & TxFlag::requireDestTag) || (uSetFlag == asfRequireDest); + bool bClearRequireDest = (uTxFlags & tfOptionalDestTag) || (uClearFlag == asfRequireDest); + bool bSetRequireAuth = (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth); + bool bClearRequireAuth = (uTxFlags & tfOptionalAuth) || (uClearFlag == asfRequireAuth); + bool bSetDisallowXRP = (uTxFlags & tfDisallowXRP) || (uSetFlag == asfDisallowXRP); + bool bClearDisallowXRP = (uTxFlags & tfAllowXRP) || (uClearFlag == asfDisallowXRP); if (uTxFlags & tfAccountSetMask) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Malformed transaction: Invalid flags set."; - + m_journal.info << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } @@ -54,8 +49,7 @@ TER AccountSetTransactor::doApply () if (bSetRequireAuth && bClearRequireAuth) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Malformed transaction: Contradictory flags set."; - + m_journal.info << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } @@ -63,20 +57,18 @@ TER AccountSetTransactor::doApply () { if (!mEngine->getNodes ().dirIsEmpty (Ledger::getOwnerDirIndex (mTxnAccountID))) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Retry: Owner directory not empty."; + m_journal.info << "Retry: Owner directory not empty."; return isSetBit(mParams, tapRETRY) ? terOWNERS : tecOWNERS; } - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Set RequireAuth."; - + m_journal.info << "Set RequireAuth."; uFlagsOut |= lsfRequireAuth; } if (bClearRequireAuth && isSetBit (uFlagsIn, lsfRequireAuth)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Clear RequireAuth."; - + m_journal.info << "Clear RequireAuth."; uFlagsOut &= ~lsfRequireAuth; } @@ -86,22 +78,19 @@ TER AccountSetTransactor::doApply () if (bSetRequireDest && bClearRequireDest) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Malformed transaction: Contradictory flags set."; - + m_journal.info << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } if (bSetRequireDest && !isSetBit (uFlagsIn, lsfRequireDestTag)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Set lsfRequireDestTag."; - + m_journal.info << "Set lsfRequireDestTag."; uFlagsOut |= lsfRequireDestTag; } if (bClearRequireDest && isSetBit (uFlagsIn, lsfRequireDestTag)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Clear lsfRequireDestTag."; - + m_journal.info << "Clear lsfRequireDestTag."; uFlagsOut &= ~lsfRequireDestTag; } @@ -111,22 +100,19 @@ TER AccountSetTransactor::doApply () if (bSetDisallowXRP && bClearDisallowXRP) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Malformed transaction: Contradictory flags set."; - + m_journal.info << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } if (bSetDisallowXRP && !isSetBit (uFlagsIn, lsfDisallowXRP)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Set lsfDisallowXRP."; - + m_journal.info << "Set lsfDisallowXRP."; uFlagsOut |= lsfDisallowXRP; } if (bClearDisallowXRP && isSetBit (uFlagsIn, lsfDisallowXRP)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Clear lsfDisallowXRP."; - + m_journal.info << "Clear lsfDisallowXRP."; uFlagsOut &= ~lsfDisallowXRP; } @@ -136,8 +122,7 @@ TER AccountSetTransactor::doApply () if ((uSetFlag == asfDisableMaster) && (uClearFlag == asfDisableMaster)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Malformed transaction: Contradictory flags set."; - + m_journal.info << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } @@ -146,15 +131,13 @@ TER AccountSetTransactor::doApply () if (!mTxnAccount->isFieldPresent (sfRegularKey)) return tecNO_REGULAR_KEY; - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Set lsfDisableMaster."; - + m_journal.info << "Set lsfDisableMaster."; uFlagsOut |= lsfDisableMaster; } if ((uClearFlag == asfDisableMaster) && isSetBit (uFlagsIn, lsfDisableMaster)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Clear lsfDisableMaster."; - + m_journal.info << "Clear lsfDisableMaster."; uFlagsOut &= ~lsfDisableMaster; } @@ -164,15 +147,13 @@ TER AccountSetTransactor::doApply () if ((uSetFlag == asfAccountTxnID) && (uClearFlag != asfAccountTxnID) && !mTxnAccount->isFieldPresent (sfAccountTxnID)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Set AccountTxnID"; - + m_journal.info << "Set AccountTxnID"; mTxnAccount->makeFieldPresent (sfAccountTxnID); } if ((uClearFlag == asfAccountTxnID) && (uSetFlag != asfAccountTxnID) && mTxnAccount->isFieldPresent (sfAccountTxnID)) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: Clear AccountTxnID"; - + m_journal.info << "Clear AccountTxnID"; mTxnAccount->makeFieldAbsent (sfAccountTxnID); } @@ -186,14 +167,12 @@ TER AccountSetTransactor::doApply () if (!uHash) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: unset email hash"; - + m_journal.info << "unset email hash"; mTxnAccount->makeFieldAbsent (sfEmailHash); } else { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: set email hash"; - + m_journal.info << "set email hash"; mTxnAccount->setFieldH128 (sfEmailHash, uHash); } } @@ -208,14 +187,12 @@ TER AccountSetTransactor::doApply () if (!uHash) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: unset wallet locator"; - + m_journal.info << "unset wallet locator"; mTxnAccount->makeFieldAbsent (sfEmailHash); } else { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: set wallet locator"; - + m_journal.info << "set wallet locator"; mTxnAccount->setFieldH256 (sfWalletLocator, uHash); } } @@ -230,19 +207,19 @@ TER AccountSetTransactor::doApply () if (vucPublic.empty ()) { - WriteLog (lsDEBUG, AccountSetTransactor) << "AccountSet: set message key"; + m_journal.debug << "set message key"; mTxnAccount->makeFieldAbsent (sfMessageKey); } if (vucPublic.size () > PUBLIC_BYTES_MAX) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: message key too long"; + m_journal.info << "message key too long"; return telBAD_PUBLIC_KEY; } else { - WriteLog (lsDEBUG, AccountSetTransactor) << "AccountSet: set message key"; + m_journal.debug << "set message key"; mTxnAccount->setFieldVL (sfMessageKey, vucPublic); } @@ -258,19 +235,19 @@ TER AccountSetTransactor::doApply () if (vucDomain.empty ()) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: unset domain"; + m_journal.info << "unset domain"; mTxnAccount->makeFieldAbsent (sfDomain); } else if (vucDomain.size () > DOMAIN_BYTES_MAX) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: domain too long"; + m_journal.info << "domain too long"; return telBAD_DOMAIN; } else { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: set domain"; + m_journal.info << "set domain"; mTxnAccount->setFieldVL (sfDomain, vucDomain); } @@ -282,24 +259,21 @@ TER AccountSetTransactor::doApply () if (mTxn.isFieldPresent (sfTransferRate)) { - std::uint32_t uRate = mTxn.getFieldU32 (sfTransferRate); + std::uint32_t uRate = mTxn.getFieldU32 (sfTransferRate); if (!uRate || uRate == QUALITY_ONE) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: unset transfer rate"; - + m_journal.info << "unset transfer rate"; mTxnAccount->makeFieldAbsent (sfTransferRate); } else if (uRate > QUALITY_ONE) { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: set transfer rate"; - + m_journal.info << "set transfer rate"; mTxnAccount->setFieldU32 (sfTransferRate, uRate); } else { - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet: bad transfer rate"; - + m_journal.info << "bad transfer rate"; return temBAD_TRANSFER_RATE; } } @@ -307,8 +281,6 @@ TER AccountSetTransactor::doApply () if (uFlagsIn != uFlagsOut) mTxnAccount->setFieldU32 (sfFlags, uFlagsOut); - WriteLog (lsINFO, AccountSetTransactor) << "AccountSet<"; - return tesSUCCESS; } diff --git a/src/ripple_app/transactors/AccountSetTransactor.h b/src/ripple_app/transactors/AccountSetTransactor.h index 7c1fb4b98..2e1c6959d 100644 --- a/src/ripple_app/transactors/AccountSetTransactor.h +++ b/src/ripple_app/transactors/AccountSetTransactor.h @@ -17,17 +17,38 @@ */ //============================================================================== -#ifndef ACCOUNTSETTRANSACTOR_H -#define ACCOUNTSETTRANSACTOR_H +#ifndef RIPPLE_TX_ACCOUNTSET_H_INCLUDED +#define RIPPLE_TX_ACCOUNTSET_H_INCLUDED namespace ripple { -class AccountSetTransactor : public Transactor +class AccountSetTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/AccountSet"; +} + +class AccountSetTransactor + : public Transactor { public: - AccountSetTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + AccountSetTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { - TER doApply (); + } + + TER doApply () override; }; } diff --git a/src/ripple_app/transactors/ChangeTransactor.cpp b/src/ripple_app/transactors/ChangeTransactor.cpp index 0a48ad1d4..cc3854cc7 100644 --- a/src/ripple_app/transactors/ChangeTransactor.cpp +++ b/src/ripple_app/transactors/ChangeTransactor.cpp @@ -19,8 +19,6 @@ namespace ripple { -SETUP_LOG (ChangeTransactor) - TER ChangeTransactor::doApply () { if (mTxn.getTxnType () == ttFEATURE) @@ -36,13 +34,13 @@ TER ChangeTransactor::checkSig () { if (mTxn.getFieldAccount160 (sfAccount).isNonZero ()) { - WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad source account"; + m_journal.warning << "Bad source account"; return temBAD_SRC_ACCOUNT; } if (!mTxn.getSigningPubKey ().empty () || !mTxn.getSignature ().empty ()) { - WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad signature"; + m_journal.warning << "Bad signature"; return temBAD_SIGNATURE; } @@ -53,7 +51,7 @@ TER ChangeTransactor::checkSeq () { if ((mTxn.getSequence () != 0) || mTxn.isFieldPresent (sfPreviousTxnID)) { - WriteLog (lsWARNING, ChangeTransactor) << "Change transaction had bad sequence"; + m_journal.warning << "Bad sequence"; return temBAD_SEQUENCE; } @@ -64,7 +62,7 @@ TER ChangeTransactor::payFee () { if (mTxn.getTransactionFee () != STAmount ()) { - WriteLog (lsWARNING, ChangeTransactor) << "Change transaction with non-zero fee"; + m_journal.warning << "Non-zero fee"; return temBAD_FEE; } @@ -77,14 +75,14 @@ TER ChangeTransactor::preCheck () if (mTxnAccountID.isNonZero ()) { - WriteLog (lsWARNING, ChangeTransactor) << "applyTransaction: bad source id"; + m_journal.warning << "Bad source id"; return temBAD_SRC_ACCOUNT; } if (isSetBit (mParams, tapOPEN_LEDGER)) { - WriteLog (lsWARNING, ChangeTransactor) << "Change transaction against open ledger"; + m_journal.warning << "Change transaction against open ledger"; return temINVALID; } @@ -93,14 +91,16 @@ TER ChangeTransactor::preCheck () TER ChangeTransactor::applyFeature () { - uint256 feature = mTxn.getFieldH256 (sfFeature); + uint256 feature (mTxn.getFieldH256 (sfFeature)); - SLE::pointer featureObject = mEngine->entryCache (ltFEATURES, Ledger::getLedgerFeatureIndex ()); + SLE::pointer featureObject (mEngine->entryCache ( + ltFEATURES, Ledger::getLedgerFeatureIndex ())); if (!featureObject) - featureObject = mEngine->entryCreate (ltFEATURES, Ledger::getLedgerFeatureIndex ()); + featureObject = mEngine->entryCreate ( + ltFEATURES, Ledger::getLedgerFeatureIndex ()); - STVector256 features = featureObject->getFieldV256 (sfFeatures); + STVector256 features (featureObject->getFieldV256 (sfFeatures)); if (features.hasValue (feature)) return tefALREADY; @@ -120,22 +120,30 @@ TER ChangeTransactor::applyFeature () TER ChangeTransactor::applyFee () { - SLE::pointer feeObject = mEngine->entryCache (ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ()); + SLE::pointer feeObject = mEngine->entryCache ( + ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ()); if (!feeObject) - feeObject = mEngine->entryCreate (ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ()); + feeObject = mEngine->entryCreate ( + ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ()); - WriteLog (lsINFO, ChangeTransactor) << "Previous fee object: " << feeObject->getJson (0); + m_journal.info << + "Previous fee object: " << feeObject->getJson (0); - feeObject->setFieldU64 (sfBaseFee, mTxn.getFieldU64 (sfBaseFee)); - feeObject->setFieldU32 (sfReferenceFeeUnits, mTxn.getFieldU32 (sfReferenceFeeUnits)); - feeObject->setFieldU32 (sfReserveBase, mTxn.getFieldU32 (sfReserveBase)); - feeObject->setFieldU32 (sfReserveIncrement, mTxn.getFieldU32 (sfReserveIncrement)); + feeObject->setFieldU64 ( + sfBaseFee, mTxn.getFieldU64 (sfBaseFee)); + feeObject->setFieldU32 ( + sfReferenceFeeUnits, mTxn.getFieldU32 (sfReferenceFeeUnits)); + feeObject->setFieldU32 ( + sfReserveBase, mTxn.getFieldU32 (sfReserveBase)); + feeObject->setFieldU32 ( + sfReserveIncrement, mTxn.getFieldU32 (sfReserveIncrement)); mEngine->entryModify (feeObject); - WriteLog (lsINFO, ChangeTransactor) << "New fee object: " << feeObject->getJson (0); - WriteLog (lsWARNING, ChangeTransactor) << "Fees have been changed"; + m_journal.info << + "New fee object: " << feeObject->getJson (0); + m_journal.warning << "Fees have been changed"; return tesSUCCESS; } diff --git a/src/ripple_app/transactors/ChangeTransactor.h b/src/ripple_app/transactors/ChangeTransactor.h index 6d11320ca..51cc0d9ce 100644 --- a/src/ripple_app/transactors/ChangeTransactor.h +++ b/src/ripple_app/transactors/ChangeTransactor.h @@ -17,32 +17,53 @@ */ //============================================================================== +#ifndef RIPPLE_TX_CHANGE_H_INCLUDED +#define RIPPLE_TX_CHANGE_H_INCLUDED + namespace ripple { -class ChangeTransactor : public Transactor +class ChangeTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/Change"; +} + +class ChangeTransactor + : public Transactor { public: - ChangeTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) - : Transactor (txn, params, engine) + ChangeTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) { - ; } - TER doApply (); - TER checkSig (); - TER checkSeq (); - TER payFee (); - TER preCheck (); + TER doApply () override; + TER checkSig () override; + TER checkSeq () override; + TER payFee () override; + TER preCheck () override; private: TER applyFeature (); TER applyFee (); // VFALCO TODO Can this be removed? - bool mustHaveValidAccount () + bool mustHaveValidAccount () override { return false; } }; } + +#endif diff --git a/src/ripple_app/transactors/OfferCancelTransactor.cpp b/src/ripple_app/transactors/OfferCancelTransactor.cpp index 8a648c4ab..25d745225 100644 --- a/src/ripple_app/transactors/OfferCancelTransactor.cpp +++ b/src/ripple_app/transactors/OfferCancelTransactor.cpp @@ -19,54 +19,54 @@ namespace ripple { -SETUP_LOG (OfferCancelTransactor) TER OfferCancelTransactor::doApply () { - TER terResult; - const std::uint32_t uOfferSequence = mTxn.getFieldU32 (sfOfferSequence); - const std::uint32_t uAccountSequenceNext = mTxnAccount->getFieldU32 (sfSequence); + std::uint32_t const uOfferSequence = mTxn.getFieldU32 (sfOfferSequence); + std::uint32_t const uAccountSequenceNext = mTxnAccount->getFieldU32 (sfSequence); - WriteLog (lsDEBUG, OfferCancelTransactor) << "OfferCancel: uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uOfferSequence; + m_journal.debug << + "uAccountSequenceNext=" << uAccountSequenceNext << + " uOfferSequence=" << uOfferSequence; - const std::uint32_t uTxFlags = mTxn.getFlags (); + std::uint32_t const uTxFlags (mTxn.getFlags ()); if (uTxFlags & tfUniversalMask) { - WriteLog (lsINFO, OfferCancelTransactor) << "OfferCancel: Malformed transaction: Invalid flags set."; - + m_journal.info << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } if (!uOfferSequence || uAccountSequenceNext - 1 <= uOfferSequence) { - WriteLog (lsINFO, OfferCancelTransactor) << "OfferCancel: uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uOfferSequence; - - terResult = temBAD_SEQUENCE; + m_journal.info << + "uAccountSequenceNext=" << uAccountSequenceNext << + " uOfferSequence=" << uOfferSequence; + return temBAD_SEQUENCE; } - else + + uint256 const uOfferIndex ( + Ledger::getOfferIndex (mTxnAccountID, uOfferSequence)); + + SLE::pointer sleOffer ( + mEngine->entryCache (ltOFFER, uOfferIndex)); + + if (sleOffer) { - const uint256 uOfferIndex = Ledger::getOfferIndex (mTxnAccountID, uOfferSequence); - SLE::pointer sleOffer = mEngine->entryCache (ltOFFER, uOfferIndex); + m_journal.debug << + "OfferCancel: uOfferSequence=" << uOfferSequence; - if (sleOffer) - { - WriteLog (lsDEBUG, OfferCancelTransactor) << "OfferCancel: uOfferSequence=" << uOfferSequence; - - terResult = mEngine->getNodes ().offerDelete (sleOffer); - } - else - { - WriteLog (lsWARNING, OfferCancelTransactor) << "OfferCancel: offer not found: " - << RippleAddress::createHumanAccountID (mTxnAccountID) - << " : " << uOfferSequence - << " : " << uOfferIndex.ToString (); - - terResult = tesSUCCESS; - } + return mEngine->getNodes ().offerDelete (sleOffer); } - return terResult; + m_journal.warning << + "OfferCancel: offer not found: " << + RippleAddress::createHumanAccountID (mTxnAccountID) << + " : " << uOfferSequence << + " : " << uOfferIndex.ToString (); + + return tesSUCCESS; } } diff --git a/src/ripple_app/transactors/OfferCancelTransactor.h b/src/ripple_app/transactors/OfferCancelTransactor.h index a191592d8..667d9426c 100644 --- a/src/ripple_app/transactors/OfferCancelTransactor.h +++ b/src/ripple_app/transactors/OfferCancelTransactor.h @@ -17,17 +17,38 @@ */ //============================================================================== -#ifndef OFFERCANCELTRANSACTOR_H -#define OFFERCANCELTRANSACTOR_H +#ifndef RIPPLE_TX_OFFERCANCEL_H_INCLUDED +#define RIPPLE_TX_OFFERCANCEL_H_INCLUDED namespace ripple { -class OfferCancelTransactor : public Transactor +class OfferCancelTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/OfferCancel"; +} + +class OfferCancelTransactor + : public Transactor { public: - OfferCancelTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + OfferCancelTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { - TER doApply (); + } + + TER doApply () override; }; } diff --git a/src/ripple_app/transactors/OfferCreateTransactor.cpp b/src/ripple_app/transactors/OfferCreateTransactor.cpp index 6bb95bc47..559e9c9fa 100644 --- a/src/ripple_app/transactors/OfferCreateTransactor.cpp +++ b/src/ripple_app/transactors/OfferCreateTransactor.cpp @@ -17,16 +17,10 @@ */ //============================================================================== -#include "../../ripple_basics/log/LogPartition.h" -#include "../../ripple_basics/utility/PlatformMacros.h" -#include "OfferCreateTransactor.h" - namespace ripple { -SETUP_LOG (OfferCreateTransactor) - // Make sure an offer is still valid. If not, mark it unfunded. -bool OfferCreateTransactor::bValidOffer ( +bool OfferCreateTransactor::isValidOffer ( SLE::ref sleOffer, const uint160& uOfferOwnerID, const STAmount& saOfferPays, @@ -35,14 +29,14 @@ bool OfferCreateTransactor::bValidOffer ( boost::unordered_set& usOfferUnfundedFound, boost::unordered_set& usOfferUnfundedBecame, boost::unordered_set& usAccountTouched, - STAmount& saOfferFunds) // <-- + STAmount& saOfferFunds) const // <-- { bool bValid = false; if (sleOffer->isFieldPresent (sfExpiration) && sleOffer->getFieldU32 (sfExpiration) <= mEngine->getLedger ()->getParentCloseTimeNC ()) { // Offer is expired. Expired offers are considered unfunded. Delete it. - WriteLog (lsINFO, OfferCreateTransactor) << "bValidOffer: encountered expired offer"; + m_journal.info << "isValidOffer: encountered expired offer"; usOfferUnfundedFound.insert (sleOffer->getIndex()); @@ -51,7 +45,7 @@ bool OfferCreateTransactor::bValidOffer ( else if (uOfferOwnerID == uTakerAccountID) { // Would take own offer. Consider old offer expired. Delete it. - WriteLog (lsINFO, OfferCreateTransactor) << "bValidOffer: encountered taker's own old offer"; + m_journal.info << "isValidOffer: encountered taker's own old offer"; usOfferUnfundedFound.insert (sleOffer->getIndex()); @@ -60,8 +54,9 @@ bool OfferCreateTransactor::bValidOffer ( else if (!saOfferGets.isPositive () || !saOfferPays.isPositive ()) { // Offer has bad amounts. Consider offer expired. Delete it. - WriteLog (lsWARNING, OfferCreateTransactor) << boost::str (boost::format ("bValidOffer: BAD OFFER: saOfferPays=%s saOfferGets=%s") - % saOfferPays % saOfferGets); + m_journal.warning << "isValidOffer: BAD OFFER:" << + " saOfferPays=" << saOfferPays << + " saOfferGets=" << saOfferGets; usOfferUnfundedFound.insert (sleOffer->getIndex()); @@ -69,14 +64,14 @@ bool OfferCreateTransactor::bValidOffer ( } else { - WriteLog (lsTRACE, OfferCreateTransactor) << "bValidOffer: saOfferPays=" << saOfferPays.getFullText (); + m_journal.trace << "isValidOffer: saOfferPays=" << saOfferPays.getFullText (); saOfferFunds = mEngine->getNodes ().accountFunds (uOfferOwnerID, saOfferPays); if (!saOfferFunds.isPositive ()) { // Offer is unfunded, possibly due to previous balance action. - WriteLog (lsDEBUG, OfferCreateTransactor) << "bValidOffer: offer unfunded: delete"; + m_journal.debug << "isValidOffer: offer unfunded: delete"; boost::unordered_set::iterator account = usAccountTouched.find (uOfferOwnerID); @@ -132,7 +127,7 @@ TER OfferCreateTransactor::takeOffers ( assert (saTakerPays && saTakerGets); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: bSell: " << bSell << ": against book: " << uBookBase.ToString (); + m_journal.debug << "takeOffers: bSell: " << bSell << ": against book: " << uBookBase.ToString (); LedgerEntrySet& lesActive = mEngine->getNodes (); const std::uint64_t uTakeQuality = STAmount::getRate (saTakerGets, saTakerPays); @@ -157,7 +152,7 @@ TER OfferCreateTransactor::takeOffers ( STAmount saTakerFunds = lesActive.accountFunds (uTakerAccountID, saTakerPays); STAmount saSubTakerPays = saTakerPays - saTakerPaid; // How much more to spend. STAmount saSubTakerGets = saTakerGets - saTakerGot; // How much more is wanted. - std::uint64_t uTipQuality = bookIterator.getCurrentQuality(); + std::uint64_t uTipQuality = bookIterator.getCurrentQuality(); if (!saTakerFunds.isPositive ()) { @@ -176,22 +171,14 @@ TER OfferCreateTransactor::takeOffers ( // Offer does not cross this offer STAmount saTipRate = STAmount::setRate (uTipQuality); - WriteLog (lsDEBUG, OfferCreateTransactor) << boost::str (boost::format ("takeOffers: done: uTakeQuality=%d %c uTipQuality=%d saTakerRate=%s %c saTipRate=%s bPassive=%d") - % uTakeQuality - % (uTakeQuality == uTipQuality - ? '=' - : uTakeQuality < uTipQuality - ? '<' - : '>') - % uTipQuality - % saTakerRate - % (saTakerRate == saTipRate - ? '=' - : saTakerRate < saTipRate - ? '<' - : '>') - % saTipRate - % bPassive); + m_journal.debug << "takeOffers: done:" << + " uTakeQuality=" << uTakeQuality << + " " << get_compare_sign (uTakeQuality, uTipQuality) << + " uTipQuality=" << uTipQuality << + " saTakerRate=" << saTakerRate << + " " << get_compare_sign (saTakerRate, saTipRate) << + " saTipRate=" << saTakerRate << + " bPassive=" << bPassive; terResult = tesSUCCESS; } @@ -204,13 +191,13 @@ TER OfferCreateTransactor::takeOffers ( if (!sleOffer) { // offer is in directory but not in ledger uint256 offerIndex = bookIterator.getCurrentIndex (); - WriteLog (lsWARNING, OfferCreateTransactor) << "takeOffers: offer not found : " << offerIndex; + m_journal.warning << "takeOffers: offer not found : " << offerIndex; usMissingOffers.insert (missingOffer_t ( bookIterator.getCurrentIndex (), bookIterator.getCurrentDirectory ())); } else { - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: considering offer : " << sleOffer->getJson (0); + m_journal.debug << "takeOffers: considering offer : " << sleOffer->getJson (0); const uint160& uOfferOwnerID = sleOffer->getFieldAccount160 (sfAccount); STAmount saOfferPays = sleOffer->getFieldAmount (sfTakerGets); @@ -219,7 +206,7 @@ TER OfferCreateTransactor::takeOffers ( STAmount saOfferFunds; // Funds of offer owner to payout. bool bValid; - bValid = bValidOffer ( + bValid = isValidOffer ( sleOffer, uOfferOwnerID, saOfferPays, saOfferGets, uTakerAccountID, usOfferUnfundedFound, usOfferUnfundedBecame, usAccountTouched, @@ -233,17 +220,17 @@ TER OfferCreateTransactor::takeOffers ( STAmount saOfferIssuerFee; STAmount saOfferRate = STAmount::setRate (uTipQuality); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerPaid: " << saTakerPaid.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerFunds: " << saTakerFunds.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saOfferFunds: " << saOfferFunds.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saOfferPays: " << saOfferPays.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saOfferGets: " << saOfferGets.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saOfferRate: " << saOfferRate.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saSubTakerPays: " << saSubTakerPays.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saSubTakerGets: " << saSubTakerGets.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText (); - WriteLog (lsTRACE, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerGets: " << saTakerGets.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saTakerPaid: " << saTakerPaid.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saTakerFunds: " << saTakerFunds.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saOfferFunds: " << saOfferFunds.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saOfferPays: " << saOfferPays.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saOfferGets: " << saOfferGets.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saOfferRate: " << saOfferRate.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saSubTakerPays: " << saSubTakerPays.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saSubTakerGets: " << saSubTakerGets.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText (); + m_journal.trace << "takeOffers: applyOffer: saTakerGets: " << saTakerGets.getFullText (); bool bOfferDelete = STAmount::applyOffer ( bSell, @@ -261,8 +248,8 @@ TER OfferCreateTransactor::takeOffers ( saTakerIssuerFee, saOfferIssuerFee); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saSubTakerPaid: " << saSubTakerPaid.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saSubTakerPaid: " << saSubTakerPaid.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText (); // Adjust offer @@ -277,7 +264,7 @@ TER OfferCreateTransactor::takeOffers ( if (bOfferDelete) { // Offer now fully claimed or now unfunded. - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: Offer claimed: Delete."; + m_journal.debug << "takeOffers: Offer claimed: Delete."; usOfferUnfundedBecame.insert (sleOffer->getIndex()); // Delete unfunded offer on success. @@ -286,11 +273,11 @@ TER OfferCreateTransactor::takeOffers ( } else if (saSubTakerGot) { - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: Offer partial claim."; + m_journal.debug << "takeOffers: Offer partial claim."; if (!saOfferPays.isPositive () || !saOfferGets.isPositive ()) { - WriteLog (lsWARNING, OfferCreateTransactor) << "takeOffers: ILLEGAL OFFER RESULT."; + m_journal.warning << "takeOffers: ILLEGAL OFFER RESULT."; bUnfunded = true; terResult = bOpenLedger ? telFAILED_PROCESSING : tecFAILED_PROCESSING; } @@ -298,7 +285,7 @@ TER OfferCreateTransactor::takeOffers ( else { // Taker got nothing, probably due to rounding. Consider taker unfunded. - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: No claim."; + m_journal.debug << "takeOffers: No claim."; bUnfunded = true; terResult = tesSUCCESS; // Done. @@ -335,10 +322,10 @@ TER OfferCreateTransactor::takeOffers ( STAmount saTakerUsed = STAmount::multiply (saSubTakerGot, saTakerRate, saTakerPays); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerCould: " << saTakerCould.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerRate: " << saTakerRate.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: applyOffer: saTakerUsed: " << saTakerUsed.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saTakerCould: " << saTakerCould.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saTakerRate: " << saTakerRate.getFullText (); + m_journal.debug << "takeOffers: applyOffer: saTakerUsed: " << saTakerUsed.getFullText (); saSubTakerPaid = std::min (saTakerCould, saTakerUsed); } @@ -357,28 +344,28 @@ TER OfferCreateTransactor::takeOffers ( if (temUNCERTAIN == terResult) terResult = tesSUCCESS; - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: " << transToken (terResult); + m_journal.debug << "takeOffers: " << transToken (terResult); if (tesSUCCESS == terResult) { // On success, delete offers that became unfunded. BOOST_FOREACH (uint256 const & uOfferIndex, usOfferUnfundedBecame) { - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers: became unfunded: " << uOfferIndex.ToString (); + m_journal.debug << "takeOffers: became unfunded: " << uOfferIndex.ToString (); lesActive.offerDelete (uOfferIndex); } } - WriteLog (lsDEBUG, OfferCreateTransactor) << "takeOffers< " << transToken (terResult); + m_journal.debug << "takeOffers< " << transToken (terResult); return terResult; } TER OfferCreateTransactor::doApply () { - WriteLog (lsTRACE, OfferCreateTransactor) << "OfferCreate> " << mTxn.getJson (0); - const std::uint32_t uTxFlags = mTxn.getFlags (); + m_journal.trace << "OfferCreate> " << mTxn.getJson (0); + const std::uint32_t uTxFlags = mTxn.getFlags (); const bool bPassive = isSetBit (uTxFlags, tfPassive); const bool bImmediateOrCancel = isSetBit (uTxFlags, tfImmediateOrCancel); const bool bFillOrKill = isSetBit (uTxFlags, tfFillOrKill); @@ -389,31 +376,31 @@ TER OfferCreateTransactor::doApply () if (!saTakerPays.isLegalNet () || !saTakerGets.isLegalNet ()) return temBAD_AMOUNT; - WriteLog (lsTRACE, OfferCreateTransactor) << boost::str (boost::format ("OfferCreate: saTakerPays=%s saTakerGets=%s") - % saTakerPays.getFullText () - % saTakerGets.getFullText ()); + m_journal.trace << + "saTakerPays=" << saTakerPays.getFullText () << + " saTakerGets=" << saTakerGets.getFullText (); const uint160 uPaysIssuerID = saTakerPays.getIssuer (); const uint160 uGetsIssuerID = saTakerGets.getIssuer (); - const std::uint32_t uExpiration = mTxn.getFieldU32 (sfExpiration); + const std::uint32_t uExpiration = mTxn.getFieldU32 (sfExpiration); const bool bHaveExpiration = mTxn.isFieldPresent (sfExpiration); const bool bHaveCancel = mTxn.isFieldPresent (sfOfferSequence); - const std::uint32_t uCancelSequence = mTxn.getFieldU32 (sfOfferSequence); - const std::uint32_t uAccountSequenceNext = mTxnAccount->getFieldU32 (sfSequence); - const std::uint32_t uSequence = mTxn.getSequence (); + const std::uint32_t uCancelSequence = mTxn.getFieldU32 (sfOfferSequence); + const std::uint32_t uAccountSequenceNext = mTxnAccount->getFieldU32 (sfSequence); + const std::uint32_t uSequence = mTxn.getSequence (); const uint256 uLedgerIndex = Ledger::getOfferIndex (mTxnAccountID, uSequence); - WriteLog (lsTRACE, OfferCreateTransactor) << "OfferCreate: Creating offer node: " << uLedgerIndex.ToString () << " uSequence=" << uSequence; + m_journal.trace << "Creating offer node: " << uLedgerIndex.ToString () << " uSequence=" << uSequence; const uint160 uPaysCurrency = saTakerPays.getCurrency (); const uint160 uGetsCurrency = saTakerGets.getCurrency (); - const std::uint64_t uRate = STAmount::getRate (saTakerGets, saTakerPays); + const std::uint64_t uRate = STAmount::getRate (saTakerGets, saTakerPays); TER terResult = tesSUCCESS; uint256 uDirectory; // Delete hints. - std::uint64_t uOwnerNode; - std::uint64_t uBookNode; + std::uint64_t uOwnerNode; + std::uint64_t uBookNode; LedgerEntrySet& lesActive = mEngine->getNodes (); LedgerEntrySet lesCheckpoint = lesActive; // Checkpoint with just fees paid. @@ -423,61 +410,61 @@ TER OfferCreateTransactor::doApply () if (uTxFlags & tfOfferCreateMask) { - WriteLog (lsINFO, OfferCreateTransactor) << "OfferCreate: Malformed transaction: Invalid flags set."; + m_journal.info << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } else if (bImmediateOrCancel && bFillOrKill) { - WriteLog (lsINFO, OfferCreateTransactor) << "OfferCreate: Malformed transaction: both IoC and FoK set."; + m_journal.info << "Malformed transaction: both IoC and FoK set."; return temINVALID_FLAG; } else if (bHaveExpiration && !uExpiration) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: bad expiration"; + m_journal.warning << "Malformed offer: bad expiration"; terResult = temBAD_EXPIRATION; } else if (saTakerPays.isNative () && saTakerGets.isNative ()) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: XRP for XRP"; + m_journal.warning << "Malformed offer: XRP for XRP"; terResult = temBAD_OFFER; } else if (!saTakerPays.isPositive () || !saTakerGets.isPositive ()) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: bad amount"; + m_journal.warning << "Malformed offer: bad amount"; terResult = temBAD_OFFER; } else if (uPaysCurrency == uGetsCurrency && uPaysIssuerID == uGetsIssuerID) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: redundant offer"; + m_journal.warning << "Malformed offer: redundant offer"; terResult = temREDUNDANT; } else if (CURRENCY_BAD == uPaysCurrency || CURRENCY_BAD == uGetsCurrency) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: Bad currency."; + m_journal.warning << "Malformed offer: Bad currency."; terResult = temBAD_CURRENCY; } else if (saTakerPays.isNative () != !uPaysIssuerID || saTakerGets.isNative () != !uGetsIssuerID) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: Malformed offer: bad issuer"; + m_journal.warning << "Malformed offer: bad issuer"; terResult = temBAD_ISSUER; } else if (!lesActive.accountFunds (mTxnAccountID, saTakerGets).isPositive ()) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: delay: Offers must be at least partially funded."; + m_journal.warning << "delay: Offers must be at least partially funded."; terResult = tecUNFUNDED_OFFER; } else if (bHaveCancel && (!uCancelSequence || uAccountSequenceNext - 1 <= uCancelSequence)) { - WriteLog (lsINFO, OfferCreateTransactor) << "OfferCreate: uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uCancelSequence; + m_journal.info << "uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uCancelSequence; terResult = temBAD_SEQUENCE; } @@ -490,13 +477,13 @@ TER OfferCreateTransactor::doApply () if (sleCancel) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: uCancelSequence=" << uCancelSequence; + m_journal.warning << "uCancelSequence=" << uCancelSequence; terResult = mEngine->getNodes ().offerDelete (sleCancel); } else { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: offer not found: " + m_journal.warning << "offer not found: " << RippleAddress::createHumanAccountID (mTxnAccountID) << " : " << uCancelSequence << " : " << uCancelIndex.ToString (); @@ -511,7 +498,7 @@ TER OfferCreateTransactor::doApply () if (!sleTakerPays) { - WriteLog (lsWARNING, OfferCreateTransactor) << "OfferCreate: delay: can't receive IOUs from non-existent issuer: " << RippleAddress::createHumanAccountID (uPaysIssuerID); + m_journal.warning << "delay: can't receive IOUs from non-existent issuer: " << RippleAddress::createHumanAccountID (uPaysIssuerID); terResult = isSetBit (mParams, tapRETRY) ? terNO_ACCOUNT : tecNO_ISSUER; } @@ -526,7 +513,7 @@ TER OfferCreateTransactor::doApply () } else if (!isSetBit (sleRippleState->getFieldU32 (sfFlags), (bHigh ? lsfHighAuth : lsfLowAuth))) { - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: delay: can't receive IOUs from issuer without auth."; + m_journal.debug << "delay: can't receive IOUs from issuer without auth."; terResult = isSetBit (mParams, tapRETRY) ? terNO_AUTH : tecNO_AUTH; } @@ -542,13 +529,14 @@ TER OfferCreateTransactor::doApply () { const uint256 uTakeBookBase = Ledger::getBookBase (uGetsCurrency, uGetsIssuerID, uPaysCurrency, uPaysIssuerID); - WriteLog (lsINFO, OfferCreateTransactor) << boost::str (boost::format ("OfferCreate: take against book: %s for %s -> %s") - % uTakeBookBase.ToString () - % saTakerGets.getFullText () - % saTakerPays.getFullText ()); + m_journal.info << + "take against book:" << uTakeBookBase.ToString () << + " for " << saTakerGets.getFullText () << + " -> " << saTakerPays.getFullText (); // Take using the parameters of the offer. - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: BEFORE saTakerGets=" << saTakerGets.getFullText (); + m_journal.debug << + "takeOffers: BEFORE saTakerGets=" << saTakerGets.getFullText (); terResult = takeOffers ( bOpenLedger, @@ -563,27 +551,32 @@ TER OfferCreateTransactor::doApply () saGot, // How much was got. bUnfunded); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers=" << terResult; - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: saPaid=" << saPaid.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: saGot=" << saGot.getFullText (); + m_journal.debug << "takeOffers=" << terResult; + m_journal.debug << "takeOffers: saPaid=" << saPaid.getFullText (); + m_journal.debug << "takeOffers: saGot=" << saGot.getFullText (); if (tesSUCCESS == terResult && !bUnfunded) { saTakerPays -= saGot; // Reduce pay in from takers by what offer just got. saTakerGets -= saPaid; // Reduce pay out to takers by what srcAccount just paid. - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: AFTER saTakerPays=" << saTakerPays.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: AFTER saTakerGets=" << saTakerGets.getFullText (); + m_journal.debug << + "takeOffers: AFTER saTakerPays=" << saTakerPays.getFullText (); + m_journal.debug << + "takeOffers: AFTER saTakerGets=" << saTakerGets.getFullText (); } } - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: saTakerPays=" << saTakerPays.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: saTakerGets=" << saTakerGets.getFullText (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: mTxnAccountID=" << RippleAddress::createHumanAccountID (mTxnAccountID); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: FUNDS=" << lesActive.accountFunds (mTxnAccountID, saTakerGets).getFullText (); - - // WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: uPaysIssuerID=" << RippleAddress::createHumanAccountID(uPaysIssuerID); - // WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: takeOffers: uGetsIssuerID=" << RippleAddress::createHumanAccountID(uGetsIssuerID); + m_journal.debug << + "takeOffers: saTakerPays=" < %s/%s") - % uBookBase.ToString () - % saTakerPays.getHumanCurrency () - % RippleAddress::createHumanAccountID (saTakerPays.getIssuer ()) - % saTakerGets.getHumanCurrency () - % RippleAddress::createHumanAccountID (saTakerGets.getIssuer ())); + m_journal.info << + "adding to book: " << uBookBase.ToString () << + " : " << saTakerPays.getHumanCurrency () << + "/" << RippleAddress::createHumanAccountID (saTakerPays.getIssuer ()) << + " -> " << saTakerGets.getHumanCurrency () << + "/" << RippleAddress::createHumanAccountID (saTakerGets.getIssuer ()); uDirectory = Ledger::getQualityIndex (uBookBase, uRate); // Use original rate. @@ -672,15 +665,22 @@ TER OfferCreateTransactor::doApply () if (tesSUCCESS == terResult) { - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: sfAccount=" << RippleAddress::createHumanAccountID (mTxnAccountID); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: uPaysIssuerID=" << RippleAddress::createHumanAccountID (uPaysIssuerID); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: uGetsIssuerID=" << RippleAddress::createHumanAccountID (uGetsIssuerID); - WriteLog (lsTRACE, OfferCreateTransactor) << "OfferCreate: saTakerPays.isNative()=" << saTakerPays.isNative (); - WriteLog (lsTRACE, OfferCreateTransactor) << "OfferCreate: saTakerGets.isNative()=" << saTakerGets.isNative (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: uPaysCurrency=" << saTakerPays.getHumanCurrency (); - WriteLog (lsDEBUG, OfferCreateTransactor) << "OfferCreate: uGetsCurrency=" << saTakerGets.getHumanCurrency (); + m_journal.debug << + "sfAccount=" << RippleAddress::createHumanAccountID (mTxnAccountID); + m_journal.debug << + "uPaysIssuerID=" << RippleAddress::createHumanAccountID (uPaysIssuerID); + m_journal.debug << + "uGetsIssuerID=" << RippleAddress::createHumanAccountID (uGetsIssuerID); + m_journal.trace << + "saTakerPays.isNative()=" << saTakerPays.isNative (); + m_journal.trace << + "saTakerGets.isNative()=" << saTakerGets.isNative (); + m_journal.debug << + "uPaysCurrency=" << saTakerPays.getHumanCurrency (); + m_journal.debug << + "uGetsCurrency=" << saTakerGets.getHumanCurrency (); - SLE::pointer sleOffer = mEngine->entryCreate (ltOFFER, uLedgerIndex); + SLE::pointer sleOffer (mEngine->entryCreate (ltOFFER, uLedgerIndex)); sleOffer->setFieldAccount (sfAccount, mTxnAccountID); sleOffer->setFieldU32 (sfSequence, uSequence); @@ -699,9 +699,9 @@ TER OfferCreateTransactor::doApply () if (bSell) sleOffer->setFlag (lsfSell); - WriteLog (lsTRACE, OfferCreateTransactor) << boost::str (boost::format ("OfferCreate: final terResult=%s sleOffer=%s") - % transToken (terResult) - % sleOffer->getJson (0)); + m_journal.trace << + "final terResult=" << transToken (terResult) << + " sleOffer=" << sleOffer->getJson (0); } } @@ -712,8 +712,8 @@ TER OfferCreateTransactor::doApply () // Go through the list of unfunded offers and remove them BOOST_FOREACH (uint256 const & uOfferIndex, usOfferUnfundedFound) { - - WriteLog (lsINFO, OfferCreateTransactor) << "takeOffers: found unfunded: " << uOfferIndex.ToString (); + m_journal.info << + "takeOffers: found unfunded: " << uOfferIndex.ToString (); lesActive.offerDelete (uOfferIndex); @@ -733,24 +733,25 @@ TER OfferCreateTransactor::doApply () vuiIndexes.erase (it); sleDirectory->setFieldV256 (sfIndexes, svIndexes); lesActive.entryModify (sleDirectory); - WriteLog (lsWARNING, OfferCreateTransactor) << "takeOffers: offer " << indexes.first << + m_journal.warning << "takeOffers: offer " << indexes.first << " removed from directory " << indexes.second; } else { - WriteLog (lsINFO, OfferCreateTransactor) << "takeOffers: offer " << indexes.first << + m_journal.info << "takeOffers: offer " << indexes.first << " not found in directory " << indexes.second; } } else { - WriteLog (lsWARNING, OfferCreateTransactor) << "takeOffers: directory " << indexes.second << + m_journal.warning << "takeOffers: directory " << indexes.second << " not found for offer " << indexes.first; } } } - CondLog (tesSUCCESS != terResult, lsINFO, OfferCreateTransactor) << boost::str (boost::format ("OfferCreate: final terResult=%s") % transToken (terResult)); + if (tesSUCCESS != terResult) m_journal.info << + "final terResult=" << transToken (terResult); return terResult; } diff --git a/src/ripple_app/transactors/OfferCreateTransactor.h b/src/ripple_app/transactors/OfferCreateTransactor.h index ae55ed041..54516534b 100644 --- a/src/ripple_app/transactors/OfferCreateTransactor.h +++ b/src/ripple_app/transactors/OfferCreateTransactor.h @@ -17,43 +17,80 @@ */ //============================================================================== -#ifndef __OFFERCREATETRANSACTOR__ -#define __OFFERCREATETRANSACTOR__ +#ifndef RIPPLE_TX_OFFERCREATE_H_INCLUDED +#define RIPPLE_TX_OFFERCREATE_H_INCLUDED namespace ripple { -class OfferCreateTransactor : public Transactor +class OfferCreateTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () { + return "Tx/OfferCreate"; +} + +class OfferCreateTransactor + : public Transactor +{ +private: + template + static std::string + get_compare_sign (T const& lhs, T const& rhs) + { + if (lhs > rhs) + return ">"; + + if (rhs > lhs) + return "<"; + + // If neither is bigger than the other, they must be equal + return "="; + } + public: - OfferCreateTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + OfferCreateTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { + + } + TER doApply (); private: - bool bValidOffer ( + bool isValidOffer ( SLE::ref sleOfferDir, - const uint160& uOfferOwnerID, - const STAmount& saOfferPays, - const STAmount& saOfferGets, - const uint160& uTakerAccountID, + uint160 const& uOfferOwnerID, + STAmount const& saOfferPays, + STAmount const& saOfferGets, + uint160 const& uTakerAccountID, boost::unordered_set& usOfferUnfundedFound, boost::unordered_set& usOfferUnfundedBecame, boost::unordered_set& usAccountTouched, - STAmount& saOfferFunds); + STAmount& saOfferFunds) const; TER takeOffers ( - const bool bOpenLedger, - const bool bPassive, - const bool bSell, + bool const bOpenLedger, + bool const bPassive, + bool const bSell, uint256 const& uBookBase, - const uint160& uTakerAccountID, + uint160 const& uTakerAccountID, SLE::ref sleTakerAccount, - const STAmount& saTakerPays, - const STAmount& saTakerGets, + STAmount const& saTakerPays, + STAmount const& saTakerGets, STAmount& saTakerPaid, STAmount& saTakerGot, bool& bUnfunded); - boost::unordered_set usOfferUnfundedFound; // Offers found unfunded. + boost::unordered_set usOfferUnfundedFound; // Offers found unfunded. typedef std::pair missingOffer_t; std::set usMissingOffers; diff --git a/src/ripple_app/transactors/PaymentTransactor.cpp b/src/ripple_app/transactors/PaymentTransactor.cpp index 05b6e672a..b4e599c1e 100644 --- a/src/ripple_app/transactors/PaymentTransactor.cpp +++ b/src/ripple_app/transactors/PaymentTransactor.cpp @@ -19,115 +19,128 @@ namespace ripple { -SETUP_LOG (PaymentTransactor) - -#define RIPPLE_PATHS_MAX 6 - TER PaymentTransactor::doApply () { // Ripple if source or destination is non-native or if there are paths. - const std::uint32_t uTxFlags = mTxn.getFlags (); - const bool bPartialPayment = isSetBit (uTxFlags, tfPartialPayment); - const bool bLimitQuality = isSetBit (uTxFlags, tfLimitQuality); - const bool bNoRippleDirect = isSetBit (uTxFlags, tfNoRippleDirect); - const bool bPaths = mTxn.isFieldPresent (sfPaths); - const bool bMax = mTxn.isFieldPresent (sfSendMax); - const uint160 uDstAccountID = mTxn.getFieldAccount160 (sfDestination); - const STAmount saDstAmount = mTxn.getFieldAmount (sfAmount); - const STAmount saMaxAmount = bMax - ? mTxn.getFieldAmount (sfSendMax) - : saDstAmount.isNative () - ? saDstAmount - : STAmount (saDstAmount.getCurrency (), mTxnAccountID, saDstAmount.getMantissa (), saDstAmount.getExponent (), saDstAmount.isNegative ()); - const uint160 uSrcCurrency = saMaxAmount.getCurrency (); - const uint160 uDstCurrency = saDstAmount.getCurrency (); - const bool bXRPDirect = uSrcCurrency.isZero () && uDstCurrency.isZero (); + std::uint32_t const uTxFlags = mTxn.getFlags (); + bool const bPartialPayment = isSetBit (uTxFlags, tfPartialPayment); + bool const bLimitQuality = isSetBit (uTxFlags, tfLimitQuality); + bool const bNoRippleDirect = isSetBit (uTxFlags, tfNoRippleDirect); + bool const bPaths = mTxn.isFieldPresent (sfPaths); + bool const bMax = mTxn.isFieldPresent (sfSendMax); + uint160 const uDstAccountID = mTxn.getFieldAccount160 (sfDestination); + STAmount const saDstAmount = mTxn.getFieldAmount (sfAmount); + STAmount const saMaxAmount = bMax + ? mTxn.getFieldAmount (sfSendMax) + : saDstAmount.isNative () + ? saDstAmount + : STAmount (saDstAmount.getCurrency (), + mTxnAccountID, + saDstAmount.getMantissa (), + saDstAmount.getExponent (), + saDstAmount.isNegative ()); + uint160 const uSrcCurrency = saMaxAmount.getCurrency (); + uint160 const uDstCurrency = saDstAmount.getCurrency (); + bool const bXRPDirect = uSrcCurrency.isZero () && uDstCurrency.isZero (); - WriteLog (lsINFO, PaymentTransactor) << boost::str (boost::format ("Payment> saMaxAmount=%s saDstAmount=%s") - % saMaxAmount.getFullText () - % saDstAmount.getFullText ()); + m_journal.info << + "saMaxAmount=" << saMaxAmount.getFullText () << + " saDstAmount=" << saDstAmount.getFullText (); if (!saDstAmount.isLegalNet () || !saMaxAmount.isLegalNet ()) return temBAD_AMOUNT; if (uTxFlags & tfPaymentMask) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Invalid flags set."; + m_journal.info << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } else if (!uDstAccountID) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Payment destination account not specified."; + m_journal.info << + "Malformed transaction: Payment destination account not specified."; return temDST_NEEDED; } else if (bMax && !saMaxAmount.isPositive ()) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: bad max amount: " << saMaxAmount.getFullText (); + m_journal.info << + "Malformed transaction: bad max amount: " << saMaxAmount.getFullText (); return temBAD_AMOUNT; } else if (!saDstAmount.isPositive ()) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: bad dst amount: " << saDstAmount.getFullText (); + m_journal.info << + "Malformed transaction: bad dst amount: " << saDstAmount.getFullText (); return temBAD_AMOUNT; } else if (CURRENCY_BAD == uSrcCurrency || CURRENCY_BAD == uDstCurrency) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Bad currency."; + m_journal.info << + "Malformed transaction: Bad currency."; return temBAD_CURRENCY; } else if (mTxnAccountID == uDstAccountID && uSrcCurrency == uDstCurrency && !bPaths) { - WriteLog (lsINFO, PaymentTransactor) << boost::str (boost::format ("Payment: Malformed transaction: Redundant transaction: src=%s, dst=%s, src_cur=%s, dst_cur=%s") - % mTxnAccountID.ToString () - % uDstAccountID.ToString () - % uSrcCurrency.ToString () - % uDstCurrency.ToString ()); + m_journal.info << + "Malformed transaction: Redundant transaction:" << + " src=" << mTxnAccountID.ToString () << + " dst=" << uDstAccountID.ToString () << + " src_cur=" << uSrcCurrency.ToString () << + " dst_cur=" << uDstCurrency.ToString (); return temREDUNDANT; } else if (bMax && saMaxAmount == saDstAmount && saMaxAmount.getCurrency () == saDstAmount.getCurrency ()) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Redundant SendMax."; + m_journal.info << + "Malformed transaction: Redundant SendMax."; return temREDUNDANT_SEND_MAX; } else if (bXRPDirect && bMax) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: SendMax specified for XRP to XRP."; + m_journal.info << + "Malformed transaction: SendMax specified for XRP to XRP."; return temBAD_SEND_XRP_MAX; } else if (bXRPDirect && bPaths) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Paths specified for XRP to XRP."; + m_journal.info << + "Malformed transaction: Paths specified for XRP to XRP."; return temBAD_SEND_XRP_PATHS; } else if (bXRPDirect && bPartialPayment) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Partial payment specified for XRP to XRP."; + m_journal.info << + "Malformed transaction: Partial payment specified for XRP to XRP."; return temBAD_SEND_XRP_PARTIAL; } else if (bXRPDirect && bLimitQuality) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: Limit quality specified for XRP to XRP."; + m_journal.info << + "Malformed transaction: Limit quality specified for XRP to XRP."; return temBAD_SEND_XRP_LIMIT; } else if (bXRPDirect && bNoRippleDirect) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: No ripple direct specified for XRP to XRP."; + m_journal.info << + "Malformed transaction: No ripple direct specified for XRP to XRP."; return temBAD_SEND_XRP_NO_DIRECT; } - SLE::pointer sleDst = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); + SLE::pointer sleDst (mEngine->entryCache ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID))); if (!sleDst) { @@ -135,36 +148,46 @@ TER PaymentTransactor::doApply () if (!saDstAmount.isNative ()) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Delay transaction: Destination account does not exist."; + m_journal.info << + "Delay transaction: Destination account does not exist."; // Another transaction could create the account and then this transaction would succeed. return tecNO_DST; } else if (isSetBit (mParams, tapOPEN_LEDGER) && bPartialPayment) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Delay transaction: Partial payment not allowed to create account."; // Make retry work smaller, by rejecting this. + m_journal.info << + "Delay transaction: Partial payment not allowed to create account."; + - // Another transaction could create the account and then this transaction would succeed. + // Another transaction could create the account and then this + // transaction would succeed. return telNO_DST_PARTIAL; } - else if (saDstAmount.getNValue () < mEngine->getLedger ()->getReserve (0)) // Reserve is not scaled by load. + // Note: Reserve is not scaled by load. + else if (saDstAmount.getNValue () < mEngine->getLedger ()->getReserve (0)) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Delay transaction: Destination account does not exist. Insufficent payment to create account."; + m_journal.info << + "Delay transaction: Destination account does not exist. " << + "Insufficent payment to create account."; - // Another transaction could create the account and then this transaction would succeed. + // Another transaction could create the account and then this + // transaction would succeed. return tecNO_DST_INSUF_XRP; } // Create the account. - sleDst = mEngine->entryCreate (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); + sleDst = mEngine->entryCreate ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); sleDst->setFieldAccount (sfAccount, uDstAccountID); sleDst->setFieldU32 (sfSequence, 1); } else if ((sleDst->getFlags () & lsfRequireDestTag) && !mTxn.isFieldPresent (sfDestinationTag)) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Malformed transaction: DestinationTag required."; + m_journal.info << + "Malformed transaction: DestinationTag required."; return tefDST_TAG_NEEDED; } @@ -173,24 +196,27 @@ TER PaymentTransactor::doApply () mEngine->entryModify (sleDst); } - TER terResult; + TER terResult; // XXX Should bMax be sufficient to imply ripple? - const bool bRipple = bPaths || bMax || !saDstAmount.isNative (); + bool const bRipple = bPaths || bMax || !saDstAmount.isNative (); if (bRipple) { // Ripple payment - STPathSet spsPaths = mTxn.getFieldPathSet (sfPaths); + STPathSet spsPaths = mTxn.getFieldPathSet (sfPaths); std::vector vpsExpanded; - STAmount saMaxAmountAct; - STAmount saDstAmountAct; + STAmount saMaxAmountAct; + STAmount saDstAmountAct; try { - terResult = isSetBit (mParams, tapOPEN_LEDGER) && spsPaths.size () > RIPPLE_PATHS_MAX - ? telBAD_PATH_COUNT // Too many paths for proposed ledger. - : RippleCalc::rippleCalc ( + bool const openLedger = isSetBit (mParams, tapOPEN_LEDGER); + bool const tooManyPaths = spsPaths.size () > MaxPathSize; + + terResult = openLedger && tooManyPaths + ? telBAD_PATH_COUNT // Too many paths for proposed ledger. + : RippleCalc::rippleCalc ( mEngine->getNodes (), saMaxAmountAct, saDstAmountAct, @@ -202,8 +228,8 @@ TER PaymentTransactor::doApply () spsPaths, bPartialPayment, bLimitQuality, - bNoRippleDirect, // Always compute for finalizing ledger. - false, // Not standalone, delete unfundeds. + bNoRippleDirect, // Always compute for finalizing ledger. + false, // Not standalone, delete unfundeds. isSetBit (mParams, tapOPEN_LEDGER)); if (isTerRetry(terResult)) @@ -212,9 +238,10 @@ TER PaymentTransactor::doApply () if ((tesSUCCESS == terResult) && (saDstAmountAct != saDstAmount)) mEngine->getNodes().setDeliveredAmount (saDstAmountAct); } - catch (const std::exception& e) + catch (std::exception const& e) { - WriteLog (lsINFO, PaymentTransactor) << "Payment: Caught throw: " << e.what (); + m_journal.info << + "Caught throw: " << e.what (); terResult = tefEXCEPTION; } @@ -223,16 +250,17 @@ TER PaymentTransactor::doApply () { // Direct XRP payment. - const std::uint32_t uOwnerCount = mTxnAccount->getFieldU32 (sfOwnerCount); - const std::uint64_t uReserve = mEngine->getLedger ()->getReserve (uOwnerCount); + std::uint32_t const uOwnerCount (mTxnAccount->getFieldU32 (sfOwnerCount)); + std::uint64_t const uReserve (mEngine->getLedger ()->getReserve (uOwnerCount)); // Make sure have enough reserve to send. Allow final spend to use reserve for fee. if (mPriorBalance < saDstAmount + std::max(uReserve, mTxn.getTransactionFee ().getNValue ())) { // Vote no. However, transaction might succeed, if applied in a different order. - WriteLog (lsINFO, PaymentTransactor) << ""; - WriteLog (lsINFO, PaymentTransactor) << boost::str (boost::format ("Payment: Delay transaction: Insufficient funds: %s / %s (%d)") - % mPriorBalance.getText () % (saDstAmount + uReserve).getText () % uReserve); + m_journal.info << "Delay transaction: Insufficient funds: " << + " " << mPriorBalance.getText () << + " / " << (saDstAmount + uReserve).getText () << + " (" << uReserve << ")"; terResult = tecUNFUNDED_PAYMENT; } @@ -245,7 +273,7 @@ TER PaymentTransactor::doApply () if ((sleDst->getFlags () & lsfPasswordSpent)) sleDst->clearFlag (lsfPasswordSpent); - terResult = tesSUCCESS; + terResult = tesSUCCESS; } } @@ -254,7 +282,8 @@ TER PaymentTransactor::doApply () if (transResultInfo (terResult, strToken, strHuman)) { - WriteLog (lsINFO, PaymentTransactor) << boost::str (boost::format ("Payment: %s: %s") % strToken % strHuman); + m_journal.info << + strToken << ": " << strHuman; } else { diff --git a/src/ripple_app/transactors/PaymentTransactor.h b/src/ripple_app/transactors/PaymentTransactor.h index 044f64d0d..57502336e 100644 --- a/src/ripple_app/transactors/PaymentTransactor.h +++ b/src/ripple_app/transactors/PaymentTransactor.h @@ -17,15 +17,39 @@ */ //============================================================================== -#ifndef __PAYMENTTRANSACTOR__ -#define __PAYMENTTRANSACTOR__ +#ifndef RIPPLE_TX_PAYMENT_H_INCLUDED +#define RIPPLE_TX_PAYMENT_H_INCLUDED namespace ripple { -class PaymentTransactor : public Transactor +class PaymentTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () { + return "Tx/Payment"; +} + +class PaymentTransactor + : public Transactor +{ + /* The largest number of paths we allow */ + static std::size_t const MaxPathSize = 6; + public: - PaymentTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + PaymentTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { + + } TER doApply (); }; diff --git a/src/ripple_app/transactors/RegularKeySetTransactor.cpp b/src/ripple_app/transactors/RegularKeySetTransactor.cpp index 61aee2286..3afc3ff50 100644 --- a/src/ripple_app/transactors/RegularKeySetTransactor.cpp +++ b/src/ripple_app/transactors/RegularKeySetTransactor.cpp @@ -19,8 +19,6 @@ namespace ripple { -SETUP_LOG (RegularKeySetTransactor) - std::uint64_t RegularKeySetTransactor::calculateBaseFee () { if ( mTxnAccount @@ -37,13 +35,12 @@ std::uint64_t RegularKeySetTransactor::calculateBaseFee () TER RegularKeySetTransactor::doApply () { - Log::out() << "RegularKeySet>"; - - const std::uint32_t uTxFlags = mTxn.getFlags (); + std::uint32_t const uTxFlags = mTxn.getFlags (); if (uTxFlags & tfUniversalMask) { - WriteLog (lsINFO, RegularKeySetTransactor) << "RegularKeySet: Malformed transaction: Invalid flags set."; + m_journal.info << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } @@ -55,18 +52,16 @@ TER RegularKeySetTransactor::doApply () if (mTxn.isFieldPresent (sfRegularKey)) { - uint160 uAuthKeyID = mTxn.getFieldAccount160 (sfRegularKey); + uint160 uAuthKeyID = mTxn.getFieldAccount160 (sfRegularKey); mTxnAccount->setFieldAccount (sfRegularKey, uAuthKeyID); } else { if (mTxnAccount->isFlag (lsfDisableMaster)) - return tecMASTER_DISABLED; + return tecMASTER_DISABLED; mTxnAccount->makeFieldAbsent (sfRegularKey); } - Log::out() << "RegularKeySet<"; - return tesSUCCESS; } diff --git a/src/ripple_app/transactors/RegularKeySetTransactor.h b/src/ripple_app/transactors/RegularKeySetTransactor.h index 5ddd7cb76..3b05e66c0 100644 --- a/src/ripple_app/transactors/RegularKeySetTransactor.h +++ b/src/ripple_app/transactors/RegularKeySetTransactor.h @@ -17,19 +17,39 @@ */ //============================================================================== -#ifndef REGULARKEYSETTRANSACTOR_H -#define REGULARKEYSETTRANSACTOR_H +#ifndef RIPPLE_TX_REGULARSETKEY_H_INCLUDED +#define RIPPLE_TX_REGULARSETKEY_H_INCLUDED namespace ripple { -class RegularKeySetTransactor : public Transactor +class RegularKeySetTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/RegularKeySet"; +} + +class RegularKeySetTransactor + : public Transactor { std::uint64_t calculateBaseFee (); + public: - RegularKeySetTransactor (const SerializedTransaction& txn, - TransactionEngineParams params, - TransactionEngine* engine) - : Transactor (txn, params, engine) {} + RegularKeySetTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { + + } + TER checkFee (); TER doApply (); }; diff --git a/src/ripple_app/transactors/Transactor.h b/src/ripple_app/transactors/Transactor.h index 65b71b983..4ca1fe66e 100644 --- a/src/ripple_app/transactors/Transactor.h +++ b/src/ripple_app/transactors/Transactor.h @@ -17,8 +17,8 @@ */ //============================================================================== -#ifndef __TRANSACTOR__ -#define __TRANSACTOR__ +#ifndef RIPPLE_TX_TRANSACTOR_H_INCLUDED +#define RIPPLE_TX_TRANSACTOR_H_INCLUDED namespace ripple { diff --git a/src/ripple_app/transactors/TrustSetTransactor.cpp b/src/ripple_app/transactors/TrustSetTransactor.cpp index 13edf8273..c2df7083b 100644 --- a/src/ripple_app/transactors/TrustSetTransactor.cpp +++ b/src/ripple_app/transactors/TrustSetTransactor.cpp @@ -19,110 +19,121 @@ namespace ripple { -SETUP_LOG (TrustSetTransactor) - TER TrustSetTransactor::doApply () { - TER terResult = tesSUCCESS; - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet>"; + TER terResult = tesSUCCESS; - const STAmount saLimitAmount = mTxn.getFieldAmount (sfLimitAmount); - const bool bQualityIn = mTxn.isFieldPresent (sfQualityIn); - const bool bQualityOut = mTxn.isFieldPresent (sfQualityOut); - const uint160 uCurrencyID = saLimitAmount.getCurrency (); - uint160 uDstAccountID = saLimitAmount.getIssuer (); - const bool bHigh = mTxnAccountID > uDstAccountID; // true, iff current is high account. + STAmount const saLimitAmount (mTxn.getFieldAmount (sfLimitAmount)); + bool const bQualityIn (mTxn.isFieldPresent (sfQualityIn)); + bool const bQualityOut (mTxn.isFieldPresent (sfQualityOut)); + + uint160 const uCurrencyID (saLimitAmount.getCurrency ()); + uint160 uDstAccountID (saLimitAmount.getIssuer ()); - std::uint32_t uQualityIn = bQualityIn ? mTxn.getFieldU32 (sfQualityIn) : 0; - std::uint32_t uQualityOut = bQualityOut ? mTxn.getFieldU32 (sfQualityOut) : 0; + // true, iff current is high account. + bool const bHigh = mTxnAccountID > uDstAccountID; + + std::uint32_t uQualityIn (bQualityIn ? mTxn.getFieldU32 (sfQualityIn) : 0); + std::uint32_t uQualityOut (bQualityOut ? mTxn.getFieldU32 (sfQualityOut) : 0); if (!saLimitAmount.isLegalNet ()) return temBAD_AMOUNT; if (bQualityIn && QUALITY_ONE == uQualityIn) - uQualityIn = 0; + uQualityIn = 0; if (bQualityOut && QUALITY_ONE == uQualityOut) uQualityOut = 0; - const std::uint32_t uTxFlags = mTxn.getFlags (); + std::uint32_t const uTxFlags = mTxn.getFlags (); if (uTxFlags & tfTrustSetMask) { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Malformed transaction: Invalid flags set."; - + m_journal.info << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } - const bool bSetAuth = isSetBit (uTxFlags, tfSetfAuth); - const bool bSetNoRipple = isSetBit (uTxFlags, tfSetNoRipple); - const bool bClearNoRipple = isSetBit (uTxFlags, tfClearNoRipple); + bool const bSetAuth = isSetBit (uTxFlags, tfSetfAuth); + bool const bSetNoRipple = isSetBit (uTxFlags, tfSetNoRipple); + bool const bClearNoRipple = isSetBit (uTxFlags, tfClearNoRipple); if (bSetAuth && !isSetBit (mTxnAccount->getFieldU32 (sfFlags), lsfRequireAuth)) { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Retry: Auth not required."; - + m_journal.info << + "Retry: Auth not required."; return tefNO_AUTH_REQUIRED; } if (saLimitAmount.isNative ()) { - WriteLog (lsINFO, TrustSetTransactor) << boost::str (boost::format ("doTrustSet: Malformed transaction: Native credit limit: %s") - % saLimitAmount.getFullText ()); - + m_journal.info << + "Malformed transaction: Native credit limit: " << + saLimitAmount.getFullText (); return temBAD_LIMIT; } if (saLimitAmount.isNegative ()) { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Malformed transaction: Negative credit limit."; - + m_journal.info << + "Malformed transaction: Negative credit limit."; return temBAD_LIMIT; } // Check if destination makes sense. if (!uDstAccountID || uDstAccountID == ACCOUNT_ONE) { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Malformed transaction: Destination account not specified."; + m_journal.info << + "Malformed transaction: Destination account not specified."; return temDST_NEEDED; } if (mTxnAccountID == uDstAccountID) { - SLE::pointer selDelete = mEngine->entryCache (ltRIPPLE_STATE, Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID)); - + SLE::pointer selDelete ( + mEngine->entryCache (ltRIPPLE_STATE, + Ledger::getRippleStateIndex ( + mTxnAccountID, uDstAccountID, uCurrencyID))); + if (selDelete) { - WriteLog (lsWARNING, TrustSetTransactor) << "doTrustSet: Clearing redundant line."; + m_journal.warning << + "Clearing redundant line."; - return mEngine->getNodes ().trustDelete (selDelete, mTxnAccountID, uDstAccountID); + return mEngine->getNodes ().trustDelete ( + selDelete, mTxnAccountID, uDstAccountID); } else { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Malformed transaction: Can not extend credit to self."; - + m_journal.info << + "Malformed transaction: Can not extend credit to self."; return temDST_IS_SRC; } } - SLE::pointer sleDst = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); + SLE::pointer sleDst (mEngine->entryCache ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID))); if (!sleDst) { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Delay transaction: Destination account does not exist."; - + m_journal.info << + "Delay transaction: Destination account does not exist."; return tecNO_DST; } - const std::uint32_t uOwnerCount = mTxnAccount->getFieldU32 (sfOwnerCount); + std::uint32_t const uOwnerCount (mTxnAccount->getFieldU32 (sfOwnerCount)); // The reserve required to create the line. - const std::uint64_t uReserveCreate = (uOwnerCount < 2) ? 0 : mEngine->getLedger ()->getReserve (uOwnerCount + 1); + std::uint64_t const uReserveCreate = + (uOwnerCount < 2) + ? 0 + : mEngine->getLedger ()->getReserve (uOwnerCount + 1); - STAmount saLimitAllow = saLimitAmount; + STAmount saLimitAllow = saLimitAmount; saLimitAllow.setIssuer (mTxnAccountID); - SLE::pointer sleRippleState = mEngine->entryCache (ltRIPPLE_STATE, Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID)); + SLE::pointer sleRippleState (mEngine->entryCache (ltRIPPLE_STATE, + Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID))); if (sleRippleState) { @@ -219,8 +230,8 @@ TER TrustSetTransactor::doApply () uHighQualityOut = bHigh ? 0 : sleRippleState->getFieldU32 (sfHighQualityOut); } - const std::uint32_t uFlagsIn = sleRippleState->getFieldU32 (sfFlags); - std::uint32_t uFlagsOut = uFlagsIn; + std::uint32_t const uFlagsIn (sleRippleState->getFieldU32 (sfFlags)); + std::uint32_t uFlagsOut (uFlagsIn); if (bSetNoRipple && !bClearNoRipple && (bHigh ? saHighBalance : saLowBalance).isGEZero()) { @@ -236,20 +247,20 @@ TER TrustSetTransactor::doApply () if (QUALITY_ONE == uHighQualityOut) uHighQualityOut = 0; - const bool bLowReserveSet = uLowQualityIn || uLowQualityOut || + bool const bLowReserveSet = uLowQualityIn || uLowQualityOut || isSetBit (uFlagsOut, lsfLowNoRipple) || !!saLowLimit || saLowBalance.isPositive (); - const bool bLowReserveClear = !bLowReserveSet; + bool const bLowReserveClear = !bLowReserveSet; - const bool bHighReserveSet = uHighQualityIn || uHighQualityOut || + bool const bHighReserveSet = uHighQualityIn || uHighQualityOut || isSetBit (uFlagsOut, lsfHighNoRipple) || !!saHighLimit || saHighBalance.isPositive (); - const bool bHighReserveClear = !bHighReserveSet; + bool const bHighReserveClear = !bHighReserveSet; - const bool bDefault = bLowReserveClear && bHighReserveClear; + bool const bDefault = bLowReserveClear && bHighReserveClear; - const bool bLowReserved = isSetBit (uFlagsIn, lsfLowReserve); - const bool bHighReserved = isSetBit (uFlagsIn, lsfHighReserve); + bool const bLowReserved = isSetBit (uFlagsIn, lsfLowReserve); + bool const bHighReserved = isSetBit (uFlagsIn, lsfHighReserve); bool bReserveIncrease = false; @@ -308,16 +319,19 @@ TER TrustSetTransactor::doApply () else if (bReserveIncrease && mPriorBalance.getNValue () < uReserveCreate) // Reserve is not scaled by load. { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Delay transaction: Insufficent reserve to add trust line."; - - // Another transaction could provide XRP to the account and then this transaction would succeed. + m_journal.info << + "Delay transaction: Insufficent reserve to add trust line."; + + // Another transaction could provide XRP to the account and then + // this transaction would succeed. terResult = tecINSUF_RESERVE_LINE; } else { mEngine->entryModify (sleRippleState); - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Modify ripple line"; + m_journal.info << + "Modify ripple line"; } } // Line does not exist. @@ -325,16 +339,17 @@ TER TrustSetTransactor::doApply () && (!bQualityIn || !uQualityIn) // Not setting quality in or setting default quality in. && (!bQualityOut || !uQualityOut)) // Not setting quality out or setting default quality out. { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Redundant: Setting non-existent ripple line to defaults."; - + m_journal.info << + "Redundant: Setting non-existent ripple line to defaults."; return tecNO_LINE_REDUNDANT; } else if (mPriorBalance.getNValue () < uReserveCreate) // Reserve is not scaled by load. { - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Delay transaction: Line does not exist. Insufficent reserve to create line."; + m_journal.info << + "Delay transaction: Line does not exist. Insufficent reserve to create line."; // Another transaction could create the account and then this transaction would succeed. - terResult = tecNO_LINE_INSUF_RESERVE; + terResult = tecNO_LINE_INSUF_RESERVE; } else if (CURRENCY_BAD == uCurrencyID) { @@ -342,13 +357,16 @@ TER TrustSetTransactor::doApply () } else { - STAmount saBalance = STAmount (uCurrencyID, ACCOUNT_ONE); // Zero balance in currency. + // Zero balance in currency. + STAmount saBalance (STAmount (uCurrencyID, ACCOUNT_ONE)); - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet: Creating ripple line: " - << Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID).ToString (); + + m_journal.info << + "doTrustSet: Creating ripple line: " << + Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID).ToString (); // Create a new ripple line. - terResult = mEngine->getNodes ().trustCreate ( + terResult = mEngine->getNodes ().trustCreate ( bHigh, mTxnAccountID, uDstAccountID, @@ -362,8 +380,6 @@ TER TrustSetTransactor::doApply () uQualityOut); } - WriteLog (lsINFO, TrustSetTransactor) << "doTrustSet<"; - return terResult; } diff --git a/src/ripple_app/transactors/TrustSetTransactor.h b/src/ripple_app/transactors/TrustSetTransactor.h index f405f6ed6..67c8b692d 100644 --- a/src/ripple_app/transactors/TrustSetTransactor.h +++ b/src/ripple_app/transactors/TrustSetTransactor.h @@ -17,15 +17,35 @@ */ //============================================================================== -#ifndef TRUSTSETTRANSACTOR_H -#define TRUSTSETTRANSACTOR_H +#ifndef RIPPLE_TX_TRUSTSET_H_INCLUDED +#define RIPPLE_TX_TRUSTSET_H_INCLUDED namespace ripple { -class TrustSetTransactor : public Transactor +class TrustSetTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/TrustSet"; +} + +class TrustSetTransactor + : public Transactor { public: - TrustSetTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + TrustSetTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { + } TER doApply (); }; diff --git a/src/ripple_app/transactors/WalletAddTransactor.cpp b/src/ripple_app/transactors/WalletAddTransactor.cpp index 7d85835a3..f55833dbc 100644 --- a/src/ripple_app/transactors/WalletAddTransactor.cpp +++ b/src/ripple_app/transactors/WalletAddTransactor.cpp @@ -19,60 +19,67 @@ namespace ripple { -SETUP_LOG (WalletAddTransactor) - TER WalletAddTransactor::doApply () { - Log::out() << "WalletAdd>"; - - Blob const vucPubKey = mTxn.getFieldVL (sfPublicKey); - Blob const vucSignature = mTxn.getFieldVL (sfSignature); - const uint160 uAuthKeyID = mTxn.getFieldAccount160 (sfRegularKey); - const RippleAddress naMasterPubKey = RippleAddress::createAccountPublic (vucPubKey); - const uint160 uDstAccountID = naMasterPubKey.getAccountID (); - - const std::uint32_t uTxFlags = mTxn.getFlags (); + std::uint32_t const uTxFlags = mTxn.getFlags (); if (uTxFlags & tfUniversalMask) { - WriteLog (lsINFO, WalletAddTransactor) << "WalletAdd: Malformed transaction: Invalid flags set."; + m_journal.info << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } + Blob const vucPubKey = mTxn.getFieldVL (sfPublicKey); + Blob const vucSignature = mTxn.getFieldVL (sfSignature); + + uint160 const uAuthKeyID (mTxn.getFieldAccount160 (sfRegularKey)); + RippleAddress const naMasterPubKey ( + RippleAddress::createAccountPublic (vucPubKey)); + uint160 const uDstAccountID (naMasterPubKey.getAccountID ()); + // FIXME: This should be moved to the transaction's signature check logic and cached if (!naMasterPubKey.accountPublicVerify ( - Serializer::getSHA512Half (uAuthKeyID.begin (), uAuthKeyID.size ()), vucSignature, ECDSA::not_strict)) + Serializer::getSHA512Half (uAuthKeyID.begin (), uAuthKeyID.size ()), + vucSignature, ECDSA::not_strict)) { - Log::out() << "WalletAdd: unauthorized: bad signature "; - + m_journal.info << + "Unauthorized: bad signature "; return tefBAD_ADD_AUTH; } - SLE::pointer sleDst = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); + SLE::pointer sleDst (mEngine->entryCache ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID))); if (sleDst) { - Log::out() << "WalletAdd: account already created"; - + m_journal.info << + "account already created"; return tefCREATED; } // Direct XRP payment. - STAmount saDstAmount = mTxn.getFieldAmount (sfAmount); - const STAmount saSrcBalance = mTxnAccount->getFieldAmount (sfBalance); - const std::uint32_t uOwnerCount = mTxnAccount->getFieldU32 (sfOwnerCount); - const std::uint64_t uReserve = mEngine->getLedger ()->getReserve (uOwnerCount); - STAmount saPaid = mTxn.getTransactionFee (); + STAmount saDstAmount = mTxn.getFieldAmount (sfAmount); + STAmount saPaid = mTxn.getTransactionFee (); + STAmount const saSrcBalance = mTxnAccount->getFieldAmount (sfBalance); + std::uint32_t const uOwnerCount = mTxnAccount->getFieldU32 (sfOwnerCount); + std::uint64_t const uReserve = mEngine->getLedger ()->getReserve (uOwnerCount); + - // Make sure have enough reserve to send. Allow final spend to use reserve for fee. - if (saSrcBalance + saPaid < saDstAmount + uReserve) // Reserve is not scaled by fee. + // Make sure have enough reserve to send. Allow final spend to use reserve + // for fee. + // Note: Reserve is not scaled by fee. + if (saSrcBalance + saPaid < saDstAmount + uReserve) { - // Vote no. However, transaction might succeed, if applied in a different order. - WriteLog (lsINFO, WalletAddTransactor) << boost::str (boost::format ("WalletAdd: Delay transaction: Insufficient funds: %s / %s (%d)") - % saSrcBalance.getText () % (saDstAmount + uReserve).getText () % uReserve); - + // Vote no. However, transaction might succeed, if applied in a + // different order. + m_journal.info << + "Delay transaction: Insufficient funds: %s / %s (%d)" << + saSrcBalance.getText () << " / " << + (saDstAmount + uReserve).getText () << " with reserve = " << + uReserve; return tecUNFUNDED_ADD; } @@ -80,15 +87,14 @@ TER WalletAddTransactor::doApply () mTxnAccount->setFieldAmount (sfBalance, saSrcBalance - saDstAmount); // Create the account. - sleDst = mEngine->entryCreate (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uDstAccountID)); + sleDst = mEngine->entryCreate (ltACCOUNT_ROOT, + Ledger::getAccountRootIndex (uDstAccountID)); sleDst->setFieldAccount (sfAccount, uDstAccountID); sleDst->setFieldU32 (sfSequence, 1); sleDst->setFieldAmount (sfBalance, saDstAmount); sleDst->setFieldAccount (sfRegularKey, uAuthKeyID); - Log::out() << "WalletAdd<"; - return tesSUCCESS; } diff --git a/src/ripple_app/transactors/WalletAddTransactor.h b/src/ripple_app/transactors/WalletAddTransactor.h index da8778dd0..e0776fce4 100644 --- a/src/ripple_app/transactors/WalletAddTransactor.h +++ b/src/ripple_app/transactors/WalletAddTransactor.h @@ -17,15 +17,35 @@ */ //============================================================================== -#ifndef WALLETADDTRANSACTOR_H -#define WALLETADDTRANSACTOR_H +#ifndef RIPPLE_TX_WALLETADD_H_INCLUDED +#define RIPPLE_TX_WALLETADD_H_INCLUDED namespace ripple { -class WalletAddTransactor : public Transactor +class WalletAddTransactorLog; + +template <> +char const* +LogPartition::getPartitionName () +{ + return "Tx/WalletAdd"; +} + +class WalletAddTransactor + : public Transactor { public: - WalletAddTransactor (const SerializedTransaction& txn, TransactionEngineParams params, TransactionEngine* engine) : Transactor (txn, params, engine) {} + WalletAddTransactor ( + SerializedTransaction const& txn, + TransactionEngineParams params, + TransactionEngine* engine) + : Transactor ( + txn, + params, + engine, + LogPartition::getJournal ()) + { + } TER doApply (); };