diff --git a/src/ripple_app/transactors/AccountSetTransactor.cpp b/src/ripple_app/transactors/AccountSetTransactor.cpp index d75afd7140..0d28f8c180 100644 --- a/src/ripple_app/transactors/AccountSetTransactor.cpp +++ b/src/ripple_app/transactors/AccountSetTransactor.cpp @@ -39,7 +39,7 @@ TER AccountSetTransactor::doApply () if (uTxFlags & tfAccountSetMask) { - m_journal.info << "Malformed transaction: Invalid flags set."; + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } @@ -49,7 +49,7 @@ TER AccountSetTransactor::doApply () if (bSetRequireAuth && bClearRequireAuth) { - m_journal.info << "Malformed transaction: Contradictory flags set."; + m_journal.trace << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } @@ -57,18 +57,18 @@ TER AccountSetTransactor::doApply () { if (!mEngine->getNodes ().dirIsEmpty (Ledger::getOwnerDirIndex (mTxnAccountID))) { - m_journal.info << "Retry: Owner directory not empty."; + m_journal.trace << "Retry: Owner directory not empty."; return isSetBit(mParams, tapRETRY) ? terOWNERS : tecOWNERS; } - m_journal.info << "Set RequireAuth."; + m_journal.trace << "Set RequireAuth."; uFlagsOut |= lsfRequireAuth; } if (bClearRequireAuth && isSetBit (uFlagsIn, lsfRequireAuth)) { - m_journal.info << "Clear RequireAuth."; + m_journal.trace << "Clear RequireAuth."; uFlagsOut &= ~lsfRequireAuth; } @@ -78,19 +78,19 @@ TER AccountSetTransactor::doApply () if (bSetRequireDest && bClearRequireDest) { - m_journal.info << "Malformed transaction: Contradictory flags set."; + m_journal.trace << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } if (bSetRequireDest && !isSetBit (uFlagsIn, lsfRequireDestTag)) { - m_journal.info << "Set lsfRequireDestTag."; + m_journal.trace << "Set lsfRequireDestTag."; uFlagsOut |= lsfRequireDestTag; } if (bClearRequireDest && isSetBit (uFlagsIn, lsfRequireDestTag)) { - m_journal.info << "Clear lsfRequireDestTag."; + m_journal.trace << "Clear lsfRequireDestTag."; uFlagsOut &= ~lsfRequireDestTag; } @@ -100,19 +100,19 @@ TER AccountSetTransactor::doApply () if (bSetDisallowXRP && bClearDisallowXRP) { - m_journal.info << "Malformed transaction: Contradictory flags set."; + m_journal.trace << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } if (bSetDisallowXRP && !isSetBit (uFlagsIn, lsfDisallowXRP)) { - m_journal.info << "Set lsfDisallowXRP."; + m_journal.trace << "Set lsfDisallowXRP."; uFlagsOut |= lsfDisallowXRP; } if (bClearDisallowXRP && isSetBit (uFlagsIn, lsfDisallowXRP)) { - m_journal.info << "Clear lsfDisallowXRP."; + m_journal.trace << "Clear lsfDisallowXRP."; uFlagsOut &= ~lsfDisallowXRP; } @@ -122,7 +122,7 @@ TER AccountSetTransactor::doApply () if ((uSetFlag == asfDisableMaster) && (uClearFlag == asfDisableMaster)) { - m_journal.info << "Malformed transaction: Contradictory flags set."; + m_journal.trace << "Malformed transaction: Contradictory flags set."; return temINVALID_FLAG; } @@ -131,13 +131,13 @@ TER AccountSetTransactor::doApply () if (!mTxnAccount->isFieldPresent (sfRegularKey)) return tecNO_REGULAR_KEY; - m_journal.info << "Set lsfDisableMaster."; + m_journal.trace << "Set lsfDisableMaster."; uFlagsOut |= lsfDisableMaster; } if ((uClearFlag == asfDisableMaster) && isSetBit (uFlagsIn, lsfDisableMaster)) { - m_journal.info << "Clear lsfDisableMaster."; + m_journal.trace << "Clear lsfDisableMaster."; uFlagsOut &= ~lsfDisableMaster; } @@ -147,13 +147,13 @@ TER AccountSetTransactor::doApply () if ((uSetFlag == asfAccountTxnID) && (uClearFlag != asfAccountTxnID) && !mTxnAccount->isFieldPresent (sfAccountTxnID)) { - m_journal.info << "Set AccountTxnID"; + m_journal.trace << "Set AccountTxnID"; mTxnAccount->makeFieldPresent (sfAccountTxnID); } if ((uClearFlag == asfAccountTxnID) && (uSetFlag != asfAccountTxnID) && mTxnAccount->isFieldPresent (sfAccountTxnID)) { - m_journal.info << "Clear AccountTxnID"; + m_journal.trace << "Clear AccountTxnID"; mTxnAccount->makeFieldAbsent (sfAccountTxnID); } @@ -167,12 +167,12 @@ TER AccountSetTransactor::doApply () if (!uHash) { - m_journal.info << "unset email hash"; + m_journal.trace << "unset email hash"; mTxnAccount->makeFieldAbsent (sfEmailHash); } else { - m_journal.info << "set email hash"; + m_journal.trace << "set email hash"; mTxnAccount->setFieldH128 (sfEmailHash, uHash); } } @@ -187,12 +187,12 @@ TER AccountSetTransactor::doApply () if (!uHash) { - m_journal.info << "unset wallet locator"; + m_journal.trace << "unset wallet locator"; mTxnAccount->makeFieldAbsent (sfEmailHash); } else { - m_journal.info << "set wallet locator"; + m_journal.trace << "set wallet locator"; mTxnAccount->setFieldH256 (sfWalletLocator, uHash); } } @@ -213,7 +213,7 @@ TER AccountSetTransactor::doApply () } if (vucPublic.size () > PUBLIC_BYTES_MAX) { - m_journal.info << "message key too long"; + m_journal.trace << "message key too long"; return telBAD_PUBLIC_KEY; } @@ -235,19 +235,19 @@ TER AccountSetTransactor::doApply () if (vucDomain.empty ()) { - m_journal.info << "unset domain"; + m_journal.trace << "unset domain"; mTxnAccount->makeFieldAbsent (sfDomain); } else if (vucDomain.size () > DOMAIN_BYTES_MAX) { - m_journal.info << "domain too long"; + m_journal.trace << "domain too long"; return telBAD_DOMAIN; } else { - m_journal.info << "set domain"; + m_journal.trace << "set domain"; mTxnAccount->setFieldVL (sfDomain, vucDomain); } @@ -263,17 +263,17 @@ TER AccountSetTransactor::doApply () if (!uRate || uRate == QUALITY_ONE) { - m_journal.info << "unset transfer rate"; + m_journal.trace << "unset transfer rate"; mTxnAccount->makeFieldAbsent (sfTransferRate); } else if (uRate > QUALITY_ONE) { - m_journal.info << "set transfer rate"; + m_journal.trace << "set transfer rate"; mTxnAccount->setFieldU32 (sfTransferRate, uRate); } else { - m_journal.info << "bad transfer rate"; + m_journal.trace << "bad transfer rate"; return temBAD_TRANSFER_RATE; } } diff --git a/src/ripple_app/transactors/ChangeTransactor.cpp b/src/ripple_app/transactors/ChangeTransactor.cpp index cc3854cc7d..6acd1f87a8 100644 --- a/src/ripple_app/transactors/ChangeTransactor.cpp +++ b/src/ripple_app/transactors/ChangeTransactor.cpp @@ -127,7 +127,7 @@ TER ChangeTransactor::applyFee () feeObject = mEngine->entryCreate ( ltFEE_SETTINGS, Ledger::getLedgerFeeIndex ()); - m_journal.info << + m_journal.trace << "Previous fee object: " << feeObject->getJson (0); feeObject->setFieldU64 ( @@ -141,7 +141,7 @@ TER ChangeTransactor::applyFee () mEngine->entryModify (feeObject); - m_journal.info << + m_journal.trace << "New fee object: " << feeObject->getJson (0); m_journal.warning << "Fees have been changed"; return tesSUCCESS; diff --git a/src/ripple_app/transactors/OfferCancelTransactor.cpp b/src/ripple_app/transactors/OfferCancelTransactor.cpp index 25d745225c..454def23d1 100644 --- a/src/ripple_app/transactors/OfferCancelTransactor.cpp +++ b/src/ripple_app/transactors/OfferCancelTransactor.cpp @@ -33,14 +33,14 @@ TER OfferCancelTransactor::doApply () if (uTxFlags & tfUniversalMask) { - m_journal.info << + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } if (!uOfferSequence || uAccountSequenceNext - 1 <= uOfferSequence) { - m_journal.info << + m_journal.trace << "uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uOfferSequence; return temBAD_SEQUENCE; diff --git a/src/ripple_app/transactors/OfferCreateTransactor.cpp b/src/ripple_app/transactors/OfferCreateTransactor.cpp index 559e9c9fa2..806c4add05 100644 --- a/src/ripple_app/transactors/OfferCreateTransactor.cpp +++ b/src/ripple_app/transactors/OfferCreateTransactor.cpp @@ -19,39 +19,41 @@ namespace ripple { -// Make sure an offer is still valid. If not, mark it unfunded. +/** Determine if an order is still valid + If the order is not valid it will be marked as unfunded. +*/ bool OfferCreateTransactor::isValidOffer ( - SLE::ref sleOffer, - const uint160& uOfferOwnerID, - const STAmount& saOfferPays, - const STAmount& saOfferGets, - const uint160& uTakerAccountID, - boost::unordered_set& usOfferUnfundedFound, - boost::unordered_set& usOfferUnfundedBecame, - boost::unordered_set& usAccountTouched, - STAmount& saOfferFunds) const // <-- + SLE::ref sleOffer, + uint160 const& uOfferOwnerID, + STAmount const& saOfferPays, + STAmount const& saOfferGets, + uint160 const& uTakerAccountID, + std::unordered_set& usOfferUnfundedBecame, + std::unordered_set& usAccountTouched, + STAmount& saOfferFunds) { - bool bValid = false; - - if (sleOffer->isFieldPresent (sfExpiration) && sleOffer->getFieldU32 (sfExpiration) <= mEngine->getLedger ()->getParentCloseTimeNC ()) + if (sleOffer->isFieldPresent (sfExpiration) && + sleOffer->getFieldU32 (sfExpiration) <= mEngine->getLedger ()->getParentCloseTimeNC ()) { // Offer is expired. Expired offers are considered unfunded. Delete it. - m_journal.info << "isValidOffer: encountered expired offer"; + m_journal.trace << "isValidOffer: encountered expired offer"; usOfferUnfundedFound.insert (sleOffer->getIndex()); - bValid = false; + return false; } - else if (uOfferOwnerID == uTakerAccountID) + + if (uOfferOwnerID == uTakerAccountID) { // Would take own offer. Consider old offer expired. Delete it. - m_journal.info << "isValidOffer: encountered taker's own old offer"; + m_journal.trace << "isValidOffer: encountered taker's own old offer"; usOfferUnfundedFound.insert (sleOffer->getIndex()); - bValid = false; + return false; } - else if (!saOfferGets.isPositive () || !saOfferPays.isPositive ()) + + if (!saOfferGets.isPositive () || !saOfferPays.isPositive ()) { // Offer has bad amounts. Consider offer expired. Delete it. m_journal.warning << "isValidOffer: BAD OFFER:" << @@ -60,51 +62,52 @@ bool OfferCreateTransactor::isValidOffer ( usOfferUnfundedFound.insert (sleOffer->getIndex()); - bValid = false; + return false; } - else + + m_journal.trace << + "isValidOffer: saOfferPays=" << saOfferPays.getFullText (); + + saOfferFunds = mEngine->getNodes ().accountFunds (uOfferOwnerID, saOfferPays); + + if (!saOfferFunds.isPositive ()) { - m_journal.trace << "isValidOffer: saOfferPays=" << saOfferPays.getFullText (); + // Offer is unfunded, possibly due to previous balance action. + m_journal.debug << "isValidOffer: offer unfunded: delete"; - saOfferFunds = mEngine->getNodes ().accountFunds (uOfferOwnerID, saOfferPays); + auto account = usAccountTouched.find (uOfferOwnerID); - if (!saOfferFunds.isPositive ()) + if (account != usAccountTouched.end ()) { - // Offer is unfunded, possibly due to previous balance action. - m_journal.debug << "isValidOffer: offer unfunded: delete"; - - boost::unordered_set::iterator account = usAccountTouched.find (uOfferOwnerID); - - if (account != usAccountTouched.end ()) - { - // Previously touched account. - usOfferUnfundedBecame.insert (sleOffer->getIndex()); // Delete unfunded offer on success. - } - else - { - // Never touched source account. - usOfferUnfundedFound.insert (sleOffer->getIndex()); // Delete found unfunded offer when possible. - } - - bValid = false; + // Previously touched account. Delete unfunded offer on success + usOfferUnfundedBecame.insert (sleOffer->getIndex()); } else { - bValid = true; + // Never touched source account. Delete found unfunded offer + // when possible. + usOfferUnfundedFound.insert (sleOffer->getIndex()); } + + return false; } - return bValid; + return true; } -// Take as much as possible. Adjusts account balances. Charges fees on top to taker. -// --> uBookBase: The order book to take against. -// --> saTakerPays: What the taker offers (w/ issuer) -// --> saTakerGets: What the taker wanted (w/ issuer) -// <-- saTakerPaid: What taker could have paid including saved not including fees. To reduce an offer. -// <-- saTakerGot: What taker got not including fees. To reduce an offer. -// <-- terResult: tesSUCCESS, terNO_ACCOUNT, telFAILED_PROCESSING, or tecFAILED_PROCESSING -// <-- bUnfunded: if tesSUCCESS, consider offer unfunded after taking. +/** Take as much as possible. + We adjusts account balances and charges fees on top to taker. + + @param uBookBase The order book to take against. + @param saTakerPays What the taker offers (w/ issuer) + @param saTakerGets What the taker wanted (w/ issuer) + @param saTakerPaid What taker could have paid including saved not including + fees. To reduce an offer. + @param saTakerGot What taker got not including fees. To reduce an offer. + @param bUnfunded if tesSUCCESS, consider offer unfunded after taking. + @return tesSUCCESS, terNO_ACCOUNT, telFAILED_PROCESSING, or + tecFAILED_PROCESSING +*/ TER OfferCreateTransactor::takeOffers ( const bool bOpenLedger, const bool bPassive, @@ -120,39 +123,46 @@ TER OfferCreateTransactor::takeOffers ( { // The book has the most elements. Take the perspective of the book. // Book is ordered for taker: taker pays / taker gets (smaller is better) - - // The order is for the other books currencys for get and pays are opposites. - // We want the same ratio for the respective currencies. - // So we swap paid and gets for determing take quality. + // The order is for the other book's currencies for get and pays are + // opposites. + // We want the same ratio for the respective currencies so we swap paid and + // gets for determing take quality. assert (saTakerPays && saTakerGets); - m_journal.debug << "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); - STAmount saTakerRate = STAmount::setRate (uTakeQuality); - const uint160 uTakerPaysAccountID = saTakerPays.getIssuer (); - const uint160 uTakerGetsAccountID = saTakerGets.getIssuer (); - TER terResult = temUNCERTAIN; + LedgerEntrySet& lesActive = mEngine->getNodes (); + std::uint64_t const uTakeQuality = STAmount::getRate (saTakerGets, saTakerPays); + STAmount saTakerRate = STAmount::setRate (uTakeQuality); + uint160 const uTakerPaysAccountID = saTakerPays.getIssuer (); + uint160 const uTakerGetsAccountID = saTakerGets.getIssuer (); + TER terResult = temUNCERTAIN; - boost::unordered_set usOfferUnfundedBecame; // Offers that became unfunded. - boost::unordered_set usAccountTouched; // Accounts touched. + // Offers that became unfunded. + std::unordered_set usOfferUnfundedBecame; - saTakerPaid = STAmount (saTakerPays.getCurrency (), saTakerPays.getIssuer ()); - saTakerGot = STAmount (saTakerGets.getCurrency (), saTakerGets.getIssuer ()); - bUnfunded = false; + // Accounts touched. + std::unordered_set usAccountTouched; + saTakerPaid = STAmount (saTakerPays.getCurrency (), saTakerPays.getIssuer ()); + saTakerGot = STAmount (saTakerGets.getCurrency (), saTakerGets.getIssuer ()); + bUnfunded = false; + + // TODO: need to track the synthesized book (source->XRP + XRP->target) + // here as well. OrderBookIterator bookIterator (lesActive, saTakerPays.getCurrency(), saTakerPays.getIssuer(), saTakerGets.getCurrency(), saTakerGets.getIssuer()); while ((temUNCERTAIN == terResult) && bookIterator.nextOffer()) { - 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(); + 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(); if (!saTakerFunds.isPositive ()) { @@ -165,13 +175,15 @@ TER OfferCreateTransactor::takeOffers ( // Offer is completely consumed terResult = tesSUCCESS; } + // TODO We must also consider the synthesized tip as well else if ((uTakeQuality < uTipQuality) || (bPassive && uTakeQuality == uTipQuality)) { // Offer does not cross this offer STAmount saTipRate = STAmount::setRate (uTipQuality); - m_journal.debug << "takeOffers: done:" << + if (m_journal.debug) m_journal.debug << + "takeOffers: done:" << " uTakeQuality=" << uTakeQuality << " " << get_compare_sign (uTakeQuality, uTipQuality) << " uTipQuality=" << uTipQuality << @@ -186,31 +198,40 @@ TER OfferCreateTransactor::takeOffers ( { // We have a crossing offer to consider. - SLE::pointer sleOffer = bookIterator.getCurrentOffer (); + // TODO Must consider the synthesized orderbook instead of just the + // direct one (i.e. look at A->XRP->B) + SLE::pointer sleOffer = bookIterator.getCurrentOffer (); if (!sleOffer) { // offer is in directory but not in ledger + // CHECKME is this cleaning up corruption? uint256 offerIndex = bookIterator.getCurrentIndex (); - m_journal.warning << "takeOffers: offer not found : " << offerIndex; + m_journal.warning << + "takeOffers: offer not found : " << offerIndex; usMissingOffers.insert (missingOffer_t ( bookIterator.getCurrentIndex (), bookIterator.getCurrentDirectory ())); } else { - m_journal.debug << "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); - STAmount saOfferGets = sleOffer->getFieldAmount (sfTakerPays); + uint160 const& uOfferOwnerID = sleOffer->getFieldAccount160 (sfAccount); + STAmount saOfferPays = sleOffer->getFieldAmount (sfTakerGets); + STAmount saOfferGets = sleOffer->getFieldAmount (sfTakerPays); STAmount saOfferFunds; // Funds of offer owner to payout. - bool bValid; - bValid = isValidOffer ( - sleOffer, uOfferOwnerID, saOfferPays, saOfferGets, - uTakerAccountID, - usOfferUnfundedFound, usOfferUnfundedBecame, usAccountTouched, - saOfferFunds); + bool const bValid = isValidOffer ( + sleOffer, + uOfferOwnerID, + saOfferPays, + saOfferGets, + uTakerAccountID, + usOfferUnfundedBecame, + usAccountTouched, + saOfferFunds); if (bValid) { @@ -220,38 +241,76 @@ TER OfferCreateTransactor::takeOffers ( STAmount saOfferIssuerFee; STAmount saOfferRate = STAmount::setRate (uTipQuality); - 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 (); + if (m_journal.trace) + { + 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, - lesActive.rippleTransferRate (uTakerAccountID, uOfferOwnerID, uTakerPaysAccountID), - lesActive.rippleTransferRate (uOfferOwnerID, uTakerAccountID, uTakerGetsAccountID), - saOfferRate, - saOfferFunds, - saTakerFunds, - saOfferPays, - saOfferGets, - saSubTakerPays, - saSubTakerGets, - saSubTakerPaid, - saSubTakerGot, - saTakerIssuerFee, - saOfferIssuerFee); + bool const bOfferDelete = STAmount::applyOffer ( + bSell, + lesActive.rippleTransferRate ( + uTakerAccountID, + uOfferOwnerID, + uTakerPaysAccountID), + lesActive.rippleTransferRate ( + uOfferOwnerID, + uTakerAccountID, + uTakerGetsAccountID), + saOfferRate, + saOfferFunds, + saTakerFunds, + saOfferPays, + saOfferGets, + saSubTakerPays, + saSubTakerGets, + saSubTakerPaid, + saSubTakerGot, + saTakerIssuerFee, + saOfferIssuerFee); - m_journal.debug << "takeOffers: applyOffer: saSubTakerPaid: " << saSubTakerPaid.getFullText (); - m_journal.debug << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText (); + m_journal.debug << + + "takeOffers: applyOffer: saSubTakerPaid: " << + saSubTakerPaid.getFullText (); + m_journal.debug << + "takeOffers: applyOffer: saSubTakerGot: " << + saSubTakerGot.getFullText (); // Adjust offer + // TODO We need to consider the combined (synthesized) + // order book. // Offer owner will pay less. Subtract what taker just got. sleOffer->setFieldAmount (sfTakerGets, saOfferPays -= saSubTakerGot); @@ -263,28 +322,40 @@ TER OfferCreateTransactor::takeOffers ( if (bOfferDelete) { - // Offer now fully claimed or now unfunded. - m_journal.debug << "takeOffers: Offer claimed: Delete."; + // TODO need to handle the synthetic case here - usOfferUnfundedBecame.insert (sleOffer->getIndex()); // Delete unfunded offer on success. + // Offer now fully claimed or now unfunded. + m_journal.debug << + "takeOffers: Offer claimed: Delete."; + + // Delete unfunded offer on success. + usOfferUnfundedBecame.insert (sleOffer->getIndex()); // Offer owner's account is no longer pristine. usAccountTouched.insert (uOfferOwnerID); } else if (saSubTakerGot) { - m_journal.debug << "takeOffers: Offer partial claim."; + m_journal.debug << + "takeOffers: Offer partial claim."; + + // TODO check the synthetic case here (to ensure there + // is no corruption) if (!saOfferPays.isPositive () || !saOfferGets.isPositive ()) { - m_journal.warning << "takeOffers: ILLEGAL OFFER RESULT."; + m_journal.warning << + "takeOffers: ILLEGAL OFFER RESULT."; bUnfunded = true; - terResult = bOpenLedger ? telFAILED_PROCESSING : tecFAILED_PROCESSING; + terResult = bOpenLedger + ? telFAILED_PROCESSING + : tecFAILED_PROCESSING; } } else { - // Taker got nothing, probably due to rounding. Consider taker unfunded. + // Taker got nothing, probably due to rounding. Consider + // taker unfunded. m_journal.debug << "takeOffers: No claim."; bUnfunded = true; @@ -296,36 +367,67 @@ TER OfferCreateTransactor::takeOffers ( if (!bUnfunded) { - // Distribute funds. The sends charge appropriate fees which are implied by offer. + // Distribute funds. The sends charge appropriate fees + // which are implied by offer. - terResult = lesActive.accountSend (uOfferOwnerID, uTakerAccountID, saSubTakerGot); // Offer owner pays taker. + // TODO Adjust for synthetic transfers - pay into A->XRP + // and pay out of XRP->B + + // Offer owner pays taker. + terResult = lesActive.accountSend ( + uOfferOwnerID, uTakerAccountID, saSubTakerGot); if (tesSUCCESS == terResult) - terResult = lesActive.accountSend (uTakerAccountID, uOfferOwnerID, saSubTakerPaid); // Taker pays offer owner. + { + // TODO: in the synthesized case, pay from B to the original taker + // Taker -> A -> XRP -> B -> ... -> Taker + + // Taker pays offer owner. + terResult = lesActive.accountSend ( + uTakerAccountID, uOfferOwnerID, saSubTakerPaid); + } if (bSell) { // Sell semantics: - // Reduce amount considered received to original offer's rate. - // Not by crossing rate, which is higher. - STAmount saEffectiveGot = STAmount::divide(saSubTakerPaid, saTakerRate, saTakerGets); + // Reduce amount considered received to original + // offer's rate. Not by the crossing rate, which is + // higher. + STAmount saEffectiveGot = STAmount::divide( + saSubTakerPaid, saTakerRate, saTakerGets); saSubTakerGot = std::min(saEffectiveGot, saSubTakerGot); } else { - // Buy semantics: Reduce amount considered paid by taker's rate. Not by actual cost which is lower. - // That is, take less as to just satify our buy requirement. - STAmount saTakerCould = saTakerPays - saTakerPaid; // Taker could pay. + // Buy semantics: Reduce amount considered paid by + // taker's rate. Not by actual cost which is lower. + // That is, take less as to just satify our buy + // requirement. + + // Taker could pay. + STAmount saTakerCould = saTakerPays - saTakerPaid; if (saTakerFunds < saTakerCould) - saTakerCould = saTakerFunds; + saTakerCould = saTakerFunds; - STAmount saTakerUsed = STAmount::multiply (saSubTakerGot, saTakerRate, saTakerPays); + STAmount saTakerUsed = STAmount::multiply ( + saSubTakerGot, saTakerRate, saTakerPays); - 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 (); + if (m_journal.debug) + { + 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); } @@ -344,127 +446,158 @@ TER OfferCreateTransactor::takeOffers ( if (temUNCERTAIN == terResult) terResult = tesSUCCESS; - m_journal.debug << "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) + for (auto uOfferIndex : usOfferUnfundedBecame) { - m_journal.debug << "takeOffers: became unfunded: " << uOfferIndex.ToString (); + m_journal.debug << + + "takeOffers: became unfunded: " << + uOfferIndex.ToString (); lesActive.offerDelete (uOfferIndex); } } - m_journal.debug << "takeOffers< " << transToken (terResult); + m_journal.debug << + "takeOffers< " << transToken (terResult); return terResult; } TER OfferCreateTransactor::doApply () { - 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); - const bool bSell = isSetBit (uTxFlags, tfSell); - STAmount saTakerPays = mTxn.getFieldAmount (sfTakerPays); - STAmount saTakerGets = mTxn.getFieldAmount (sfTakerGets); + if (m_journal.trace) m_journal.trace << + "OfferCreate> " << mTxn.getJson (0); + + std::uint32_t const uTxFlags = mTxn.getFlags (); + bool const bPassive = isSetBit (uTxFlags, tfPassive); + bool const bImmediateOrCancel = isSetBit (uTxFlags, tfImmediateOrCancel); + bool const bFillOrKill = isSetBit (uTxFlags, tfFillOrKill); + bool const bSell = isSetBit (uTxFlags, tfSell); + STAmount saTakerPays = mTxn.getFieldAmount (sfTakerPays); + STAmount saTakerGets = mTxn.getFieldAmount (sfTakerGets); if (!saTakerPays.isLegalNet () || !saTakerGets.isLegalNet ()) return temBAD_AMOUNT; - m_journal.trace << + 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 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 (); + uint160 const uPaysIssuerID = saTakerPays.getIssuer (); + uint160 const uGetsIssuerID = saTakerGets.getIssuer (); - const uint256 uLedgerIndex = Ledger::getOfferIndex (mTxnAccountID, uSequence); + bool const bHaveExpiration (mTxn.isFieldPresent (sfExpiration)); + bool const bHaveCancel (mTxn.isFieldPresent (sfOfferSequence)); - m_journal.trace << "Creating offer node: " << uLedgerIndex.ToString () << " uSequence=" << uSequence; + std::uint32_t const uExpiration = mTxn.getFieldU32 (sfExpiration); + std::uint32_t const uCancelSequence = mTxn.getFieldU32 (sfOfferSequence); - const uint160 uPaysCurrency = saTakerPays.getCurrency (); - const uint160 uGetsCurrency = saTakerGets.getCurrency (); - const std::uint64_t uRate = STAmount::getRate (saTakerGets, saTakerPays); + // FIXME understand why we use SequenceNext instead of current transaction + // sequence to determine the transaction. Why is the offer seuqnce + // number insufficient? + + std::uint32_t const uAccountSequenceNext = mTxnAccount->getFieldU32 (sfSequence); + std::uint32_t const uSequence = mTxn.getSequence (); + + const uint256 uLedgerIndex = Ledger::getOfferIndex (mTxnAccountID, 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); 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. - lesActive.bumpSeq (); // Begin ledger variance. + LedgerEntrySet& lesActive = mEngine->getNodes (); + LedgerEntrySet lesCheckpoint = lesActive; // Checkpoint with just fees paid. + lesActive.bumpSeq (); // Begin ledger variance. - SLE::pointer sleCreator = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (mTxnAccountID)); + SLE::pointer sleCreator = mEngine->entryCache ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (mTxnAccountID)); if (uTxFlags & tfOfferCreateMask) { - m_journal.info << "Malformed transaction: Invalid flags set."; + m_journal.trace << + "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } else if (bImmediateOrCancel && bFillOrKill) { - m_journal.info << "Malformed transaction: both IoC and FoK set."; + m_journal.trace << + "Malformed transaction: both IoC and FoK set."; return temINVALID_FLAG; } else if (bHaveExpiration && !uExpiration) { - m_journal.warning << "Malformed offer: bad expiration"; + m_journal.warning << + "Malformed offer: bad expiration"; terResult = temBAD_EXPIRATION; } else if (saTakerPays.isNative () && saTakerGets.isNative ()) { - m_journal.warning << "Malformed offer: XRP for XRP"; + m_journal.warning << + "Malformed offer: XRP for XRP"; terResult = temBAD_OFFER; } else if (!saTakerPays.isPositive () || !saTakerGets.isPositive ()) { - m_journal.warning << "Malformed offer: bad amount"; + m_journal.warning << + "Malformed offer: bad amount"; terResult = temBAD_OFFER; } else if (uPaysCurrency == uGetsCurrency && uPaysIssuerID == uGetsIssuerID) { - m_journal.warning << "Malformed offer: redundant offer"; + m_journal.warning << + "Malformed offer: redundant offer"; terResult = temREDUNDANT; } + // FIXME: XRP is not a bad currency, not not allowed as IOU else if (CURRENCY_BAD == uPaysCurrency || CURRENCY_BAD == uGetsCurrency) { - m_journal.warning << "Malformed offer: Bad currency."; + m_journal.warning << + "Malformed offer: Bad currency."; terResult = temBAD_CURRENCY; } else if (saTakerPays.isNative () != !uPaysIssuerID || saTakerGets.isNative () != !uGetsIssuerID) { - m_journal.warning << "Malformed offer: bad issuer"; + m_journal.warning << + "Malformed offer: bad issuer"; terResult = temBAD_ISSUER; } else if (!lesActive.accountFunds (mTxnAccountID, saTakerGets).isPositive ()) { - m_journal.warning << "delay: Offers must be at least partially funded."; + m_journal.warning << + "delay: Offers must be at least partially funded."; terResult = tecUNFUNDED_OFFER; } + // This can probably be simplified to make sure that you cancel sequences + // before the transaction sequence number. else if (bHaveCancel && (!uCancelSequence || uAccountSequenceNext - 1 <= uCancelSequence)) { - m_journal.info << "uAccountSequenceNext=" << uAccountSequenceNext << " uOfferSequence=" << uCancelSequence; + m_journal.trace << + "uAccountSequenceNext=" << uAccountSequenceNext << + " uOfferSequence=" << uCancelSequence; terResult = temBAD_SEQUENCE; } @@ -477,43 +610,71 @@ TER OfferCreateTransactor::doApply () if (sleCancel) { - m_journal.warning << "uCancelSequence=" << uCancelSequence; + m_journal.warning << + "uCancelSequence=" << uCancelSequence; terResult = mEngine->getNodes ().offerDelete (sleCancel); } else { - m_journal.warning << "offer not found: " - << RippleAddress::createHumanAccountID (mTxnAccountID) - << " : " << uCancelSequence - << " : " << uCancelIndex.ToString (); + // It's not an error to not find the offer to cancel: it might have + // been consumed or removed as we are processing. Additionally, it + // might not even have been an offer - we don't care. + + if (m_journal.warning) m_journal.warning << + "offer not found: " << + RippleAddress::createHumanAccountID (mTxnAccountID) << + " : " << uCancelSequence << + " : " << uCancelIndex.ToString (); } } - // Make sure authorized to hold what taker will pay. - bool bExpired = (bHaveExpiration && mEngine->getLedger ()->getParentCloseTimeNC () >= uExpiration); + // We definitely know the time that the parent ledger closed but we do not + // know the closing time of the ledger under construction. + // FIXME: Make sure that expiration is documented in terms of the close time + // of the previous ledger. + bool bExpired = + bHaveExpiration && + (mEngine->getLedger ()->getParentCloseTimeNC () >= uExpiration); + + // If all is well and this isn't an offer to XRP, then we make sure we are + // authorized to hold what the taker will pay. if (tesSUCCESS == terResult && !saTakerPays.isNative () && !bExpired) { - SLE::pointer sleTakerPays = mEngine->entryCache (ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uPaysIssuerID)); + SLE::pointer sleTakerPays = mEngine->entryCache ( + ltACCOUNT_ROOT, Ledger::getAccountRootIndex (uPaysIssuerID)); if (!sleTakerPays) { - m_journal.warning << "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; } else if (isSetBit (sleTakerPays->getFieldU32 (sfFlags), lsfRequireAuth)) { - SLE::pointer sleRippleState = mEngine->entryCache (ltRIPPLE_STATE, Ledger::getRippleStateIndex (mTxnAccountID, uPaysIssuerID, uPaysCurrency)); - bool bHigh = mTxnAccountID > uPaysIssuerID; + SLE::pointer sleRippleState (mEngine->entryCache ( + ltRIPPLE_STATE, + Ledger::getRippleStateIndex ( + mTxnAccountID, uPaysIssuerID, uPaysCurrency))); + + // Entries have a canonical representation, determined by a + // lexicographical "greater than" comparison employing strict weak + // ordering. + // Determine which entry we need to access. + bool const canonical_gt (mTxnAccountID > uPaysIssuerID); if (!sleRippleState) { - terResult = isSetBit (mParams, tapRETRY) ? terNO_LINE : tecNO_LINE; + terResult = isSetBit (mParams, tapRETRY) + ? terNO_LINE + : tecNO_LINE; } - else if (!isSetBit (sleRippleState->getFieldU32 (sfFlags), (bHigh ? lsfHighAuth : lsfLowAuth))) + else if (!isSetBit (sleRippleState->getFieldU32 (sfFlags), (canonical_gt ? lsfHighAuth : lsfLowAuth))) { - m_journal.debug << "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; } @@ -527,15 +688,16 @@ TER OfferCreateTransactor::doApply () if ((tesSUCCESS == terResult) && !bExpired) { - const uint256 uTakeBookBase = Ledger::getBookBase (uGetsCurrency, uGetsIssuerID, uPaysCurrency, uPaysIssuerID); + const uint256 uTakeBookBase = Ledger::getBookBase ( + uGetsCurrency, uGetsIssuerID, uPaysCurrency, uPaysIssuerID); - m_journal.info << - "take against book:" << uTakeBookBase.ToString () << - " for " << saTakerGets.getFullText () << + if (m_journal.trace) m_journal.trace << + "take against book:" << uTakeBookBase.ToString () << + " for " << saTakerGets.getFullText () << " -> " << saTakerPays.getFullText (); // Take using the parameters of the offer. - m_journal.debug << + if (m_journal.debug) m_journal.debug << "takeOffers: BEFORE saTakerGets=" << saTakerGets.getFullText (); terResult = takeOffers ( @@ -551,32 +713,45 @@ TER OfferCreateTransactor::doApply () saGot, // How much was got. bUnfunded); - m_journal.debug << "takeOffers=" << terResult; - m_journal.debug << "takeOffers: saPaid=" << saPaid.getFullText (); - m_journal.debug << "takeOffers: saGot=" << saGot.getFullText (); + if (m_journal.debug) + { + 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. + // Reduce pay in from takers by what offer just got. + saTakerPays -= saGot; + // Reduce pay out to takers by what srcAccount just paid. + saTakerGets -= saPaid; - m_journal.debug << - "takeOffers: AFTER saTakerPays=" << saTakerPays.getFullText (); - m_journal.debug << - "takeOffers: AFTER saTakerGets=" << saTakerGets.getFullText (); + if (m_journal.debug) + { + m_journal.debug << + "takeOffers: AFTER saTakerPays=" << + saTakerPays.getFullText (); + m_journal.debug << + "takeOffers: AFTER saTakerGets=" << + saTakerGets.getFullText (); + } } } - m_journal.debug << - "takeOffers: saTakerPays=" <getFieldV256 (sfIndexes); std::vector& vuiIndexes = svIndexes.peekValue(); - std::vector::iterator it = std::find (vuiIndexes.begin(), vuiIndexes.end (), indexes.first); + + auto it = std::find ( + vuiIndexes.begin (), vuiIndexes.end (), indexes.first); + if (it != vuiIndexes.end ()) { vuiIndexes.erase (it); sleDirectory->setFieldV256 (sfIndexes, svIndexes); lesActive.entryModify (sleDirectory); - m_journal.warning << "takeOffers: offer " << indexes.first << + m_journal.warning << + "takeOffers: offer " << indexes.first << " removed from directory " << indexes.second; } else { - m_journal.info << "takeOffers: offer " << indexes.first << + m_journal.trace << + "takeOffers: offer " << indexes.first << " not found in directory " << indexes.second; } } else { - m_journal.warning << "takeOffers: directory " << indexes.second << + m_journal.warning << + "takeOffers: directory " << indexes.second << " not found for offer " << indexes.first; } } } - if (tesSUCCESS != terResult) m_journal.info << + if (tesSUCCESS != terResult) m_journal.trace << "final terResult=" << transToken (terResult); return terResult; diff --git a/src/ripple_app/transactors/OfferCreateTransactor.h b/src/ripple_app/transactors/OfferCreateTransactor.h index 54516534b7..3b8c548872 100644 --- a/src/ripple_app/transactors/OfferCreateTransactor.h +++ b/src/ripple_app/transactors/OfferCreateTransactor.h @@ -20,6 +20,8 @@ #ifndef RIPPLE_TX_OFFERCREATE_H_INCLUDED #define RIPPLE_TX_OFFERCREATE_H_INCLUDED +#include + namespace ripple { class OfferCreateTransactorLog; @@ -72,10 +74,9 @@ private: STAmount const& saOfferPays, STAmount const& saOfferGets, uint160 const& uTakerAccountID, - boost::unordered_set& usOfferUnfundedFound, - boost::unordered_set& usOfferUnfundedBecame, - boost::unordered_set& usAccountTouched, - STAmount& saOfferFunds) const; + std::unordered_set& usOfferUnfundedBecame, + std::unordered_set& usAccountTouched, + STAmount& saOfferFunds); TER takeOffers ( bool const bOpenLedger, @@ -90,7 +91,8 @@ private: STAmount& saTakerGot, bool& bUnfunded); - boost::unordered_set usOfferUnfundedFound; // Offers found unfunded. + // Offers found unfunded. + std::unordered_set usOfferUnfundedFound; 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 b4e599c1e0..16a0971efb 100644 --- a/src/ripple_app/transactors/PaymentTransactor.cpp +++ b/src/ripple_app/transactors/PaymentTransactor.cpp @@ -43,7 +43,7 @@ TER PaymentTransactor::doApply () uint160 const uDstCurrency = saDstAmount.getCurrency (); bool const bXRPDirect = uSrcCurrency.isZero () && uDstCurrency.isZero (); - m_journal.info << + m_journal.trace << "saMaxAmount=" << saMaxAmount.getFullText () << " saDstAmount=" << saDstAmount.getFullText (); @@ -52,42 +52,42 @@ TER PaymentTransactor::doApply () if (uTxFlags & tfPaymentMask) { - m_journal.info << + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } else if (!uDstAccountID) { - m_journal.info << + m_journal.trace << "Malformed transaction: Payment destination account not specified."; return temDST_NEEDED; } else if (bMax && !saMaxAmount.isPositive ()) { - m_journal.info << + m_journal.trace << "Malformed transaction: bad max amount: " << saMaxAmount.getFullText (); return temBAD_AMOUNT; } else if (!saDstAmount.isPositive ()) { - m_journal.info << + m_journal.trace << "Malformed transaction: bad dst amount: " << saDstAmount.getFullText (); return temBAD_AMOUNT; } else if (CURRENCY_BAD == uSrcCurrency || CURRENCY_BAD == uDstCurrency) { - m_journal.info << + m_journal.trace << "Malformed transaction: Bad currency."; return temBAD_CURRENCY; } else if (mTxnAccountID == uDstAccountID && uSrcCurrency == uDstCurrency && !bPaths) { - m_journal.info << + m_journal.trace << "Malformed transaction: Redundant transaction:" << " src=" << mTxnAccountID.ToString () << " dst=" << uDstAccountID.ToString () << @@ -98,42 +98,42 @@ TER PaymentTransactor::doApply () } else if (bMax && saMaxAmount == saDstAmount && saMaxAmount.getCurrency () == saDstAmount.getCurrency ()) { - m_journal.info << + m_journal.trace << "Malformed transaction: Redundant SendMax."; return temREDUNDANT_SEND_MAX; } else if (bXRPDirect && bMax) { - m_journal.info << + m_journal.trace << "Malformed transaction: SendMax specified for XRP to XRP."; return temBAD_SEND_XRP_MAX; } else if (bXRPDirect && bPaths) { - m_journal.info << + m_journal.trace << "Malformed transaction: Paths specified for XRP to XRP."; return temBAD_SEND_XRP_PATHS; } else if (bXRPDirect && bPartialPayment) { - m_journal.info << + m_journal.trace << "Malformed transaction: Partial payment specified for XRP to XRP."; return temBAD_SEND_XRP_PARTIAL; } else if (bXRPDirect && bLimitQuality) { - m_journal.info << + m_journal.trace << "Malformed transaction: Limit quality specified for XRP to XRP."; return temBAD_SEND_XRP_LIMIT; } else if (bXRPDirect && bNoRippleDirect) { - m_journal.info << + m_journal.trace << "Malformed transaction: No ripple direct specified for XRP to XRP."; return temBAD_SEND_XRP_NO_DIRECT; @@ -148,7 +148,7 @@ TER PaymentTransactor::doApply () if (!saDstAmount.isNative ()) { - m_journal.info << + m_journal.trace << "Delay transaction: Destination account does not exist."; // Another transaction could create the account and then this transaction would succeed. @@ -157,7 +157,7 @@ TER PaymentTransactor::doApply () else if (isSetBit (mParams, tapOPEN_LEDGER) && bPartialPayment) { // Make retry work smaller, by rejecting this. - m_journal.info << + m_journal.trace << "Delay transaction: Partial payment not allowed to create account."; @@ -168,7 +168,7 @@ TER PaymentTransactor::doApply () // Note: Reserve is not scaled by load. else if (saDstAmount.getNValue () < mEngine->getLedger ()->getReserve (0)) { - m_journal.info << + m_journal.trace << "Delay transaction: Destination account does not exist. " << "Insufficent payment to create account."; @@ -186,7 +186,7 @@ TER PaymentTransactor::doApply () } else if ((sleDst->getFlags () & lsfRequireDestTag) && !mTxn.isFieldPresent (sfDestinationTag)) { - m_journal.info << + m_journal.trace << "Malformed transaction: DestinationTag required."; return tefDST_TAG_NEEDED; @@ -240,7 +240,7 @@ TER PaymentTransactor::doApply () } catch (std::exception const& e) { - m_journal.info << + m_journal.trace << "Caught throw: " << e.what (); terResult = tefEXCEPTION; @@ -257,7 +257,7 @@ TER PaymentTransactor::doApply () if (mPriorBalance < saDstAmount + std::max(uReserve, mTxn.getTransactionFee ().getNValue ())) { // Vote no. However, transaction might succeed, if applied in a different order. - m_journal.info << "Delay transaction: Insufficient funds: " << + m_journal.trace << "Delay transaction: Insufficient funds: " << " " << mPriorBalance.getText () << " / " << (saDstAmount + uReserve).getText () << " (" << uReserve << ")"; @@ -282,7 +282,7 @@ TER PaymentTransactor::doApply () if (transResultInfo (terResult, strToken, strHuman)) { - m_journal.info << + m_journal.trace << strToken << ": " << strHuman; } else diff --git a/src/ripple_app/transactors/RegularKeySetTransactor.cpp b/src/ripple_app/transactors/RegularKeySetTransactor.cpp index 3afc3ff500..068aec3a9a 100644 --- a/src/ripple_app/transactors/RegularKeySetTransactor.cpp +++ b/src/ripple_app/transactors/RegularKeySetTransactor.cpp @@ -39,7 +39,7 @@ TER RegularKeySetTransactor::doApply () if (uTxFlags & tfUniversalMask) { - m_journal.info << + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; diff --git a/src/ripple_app/transactors/Transactor.cpp b/src/ripple_app/transactors/Transactor.cpp index 93e091b2bc..238e218c0d 100644 --- a/src/ripple_app/transactors/Transactor.cpp +++ b/src/ripple_app/transactors/Transactor.cpp @@ -110,7 +110,7 @@ TER Transactor::payFee () // Only check fee is sufficient when the ledger is open. if (isSetBit (mParams, tapOPEN_LEDGER) && saPaid < mFeeDue) { - m_journal.info << "Insufficient fee paid: " << + m_journal.trace << "Insufficient fee paid: " << saPaid.getText () << "/" << mFeeDue.getText (); return telINSUF_FEE_P; @@ -125,7 +125,7 @@ TER Transactor::payFee () // Will only write the account back, if the transaction succeeds. if (mSourceBalance < saPaid) { - m_journal.info << "Insufficient balance:" << + m_journal.trace << "Insufficient balance:" << " balance=" << mSourceBalance.getText () << " paid=" << saPaid.getText (); @@ -156,12 +156,12 @@ TER Transactor::checkSig () } else if (mHasAuthKey) { - m_journal.info << "applyTransaction: Delay: Not authorized to use account."; + m_journal.trace << "applyTransaction: Delay: Not authorized to use account."; return tefBAD_AUTH; } else { - m_journal.info << "applyTransaction: Invalid: Not authorized to use account."; + m_journal.trace << "applyTransaction: Invalid: Not authorized to use account."; return temBAD_AUTH_MASTER; } @@ -180,7 +180,7 @@ TER Transactor::checkSeq () { if (a_seq < t_seq) { - m_journal.info << "apply: transaction has future sequence number"; + m_journal.trace << "apply: transaction has future sequence number"; return terPRE_SEQ; } diff --git a/src/ripple_app/transactors/TrustSetTransactor.cpp b/src/ripple_app/transactors/TrustSetTransactor.cpp index c2df7083b6..3db0beb98f 100644 --- a/src/ripple_app/transactors/TrustSetTransactor.cpp +++ b/src/ripple_app/transactors/TrustSetTransactor.cpp @@ -49,7 +49,7 @@ TER TrustSetTransactor::doApply () if (uTxFlags & tfTrustSetMask) { - m_journal.info << + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; } @@ -60,14 +60,14 @@ TER TrustSetTransactor::doApply () if (bSetAuth && !isSetBit (mTxnAccount->getFieldU32 (sfFlags), lsfRequireAuth)) { - m_journal.info << + m_journal.trace << "Retry: Auth not required."; return tefNO_AUTH_REQUIRED; } if (saLimitAmount.isNative ()) { - m_journal.info << + m_journal.trace << "Malformed transaction: Native credit limit: " << saLimitAmount.getFullText (); return temBAD_LIMIT; @@ -75,7 +75,7 @@ TER TrustSetTransactor::doApply () if (saLimitAmount.isNegative ()) { - m_journal.info << + m_journal.trace << "Malformed transaction: Negative credit limit."; return temBAD_LIMIT; } @@ -83,7 +83,7 @@ TER TrustSetTransactor::doApply () // Check if destination makes sense. if (!uDstAccountID || uDstAccountID == ACCOUNT_ONE) { - m_journal.info << + m_journal.trace << "Malformed transaction: Destination account not specified."; return temDST_NEEDED; @@ -106,7 +106,7 @@ TER TrustSetTransactor::doApply () } else { - m_journal.info << + m_journal.trace << "Malformed transaction: Can not extend credit to self."; return temDST_IS_SRC; } @@ -117,7 +117,7 @@ TER TrustSetTransactor::doApply () if (!sleDst) { - m_journal.info << + m_journal.trace << "Delay transaction: Destination account does not exist."; return tecNO_DST; } @@ -319,7 +319,7 @@ TER TrustSetTransactor::doApply () else if (bReserveIncrease && mPriorBalance.getNValue () < uReserveCreate) // Reserve is not scaled by load. { - m_journal.info << + m_journal.trace << "Delay transaction: Insufficent reserve to add trust line."; // Another transaction could provide XRP to the account and then @@ -330,7 +330,7 @@ TER TrustSetTransactor::doApply () { mEngine->entryModify (sleRippleState); - m_journal.info << + m_journal.trace << "Modify ripple line"; } } @@ -339,13 +339,13 @@ 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. { - m_journal.info << + m_journal.trace << "Redundant: Setting non-existent ripple line to defaults."; return tecNO_LINE_REDUNDANT; } else if (mPriorBalance.getNValue () < uReserveCreate) // Reserve is not scaled by load. { - m_journal.info << + m_journal.trace << "Delay transaction: Line does not exist. Insufficent reserve to create line."; // Another transaction could create the account and then this transaction would succeed. @@ -361,7 +361,7 @@ TER TrustSetTransactor::doApply () STAmount saBalance (STAmount (uCurrencyID, ACCOUNT_ONE)); - m_journal.info << + m_journal.trace << "doTrustSet: Creating ripple line: " << Ledger::getRippleStateIndex (mTxnAccountID, uDstAccountID, uCurrencyID).ToString (); diff --git a/src/ripple_app/transactors/WalletAddTransactor.cpp b/src/ripple_app/transactors/WalletAddTransactor.cpp index f55833dbc2..cbbf11fa4e 100644 --- a/src/ripple_app/transactors/WalletAddTransactor.cpp +++ b/src/ripple_app/transactors/WalletAddTransactor.cpp @@ -25,7 +25,7 @@ TER WalletAddTransactor::doApply () if (uTxFlags & tfUniversalMask) { - m_journal.info << + m_journal.trace << "Malformed transaction: Invalid flags set."; return temINVALID_FLAG; @@ -44,7 +44,7 @@ TER WalletAddTransactor::doApply () Serializer::getSHA512Half (uAuthKeyID.begin (), uAuthKeyID.size ()), vucSignature, ECDSA::not_strict)) { - m_journal.info << + m_journal.trace << "Unauthorized: bad signature "; return tefBAD_ADD_AUTH; } @@ -54,7 +54,7 @@ TER WalletAddTransactor::doApply () if (sleDst) { - m_journal.info << + m_journal.trace << "account already created"; return tefCREATED; } @@ -75,7 +75,7 @@ TER WalletAddTransactor::doApply () { // Vote no. However, transaction might succeed, if applied in a // different order. - m_journal.info << + m_journal.trace << "Delay transaction: Insufficient funds: %s / %s (%d)" << saSrcBalance.getText () << " / " << (saDstAmount + uReserve).getText () << " with reserve = " <<