From d62c6a974e54c040bb2fb0427797ea3d0e146581 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Wed, 18 Jul 2012 17:40:21 -0700 Subject: [PATCH] Add logging for offer create. --- src/Amount.cpp | 22 ++++++++++++-- src/RPCServer.cpp | 23 +++++++------- src/SerializedTypes.h | 1 + src/TransactionEngine.cpp | 64 +++++++++++++++++++++++++++------------ 4 files changed, 78 insertions(+), 32 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index ed38f7b3d9..1fb63fea4b 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -743,7 +743,7 @@ uint64 STAmount::getRate(const STAmount& offerOut, const STAmount& offerIn) // Taker gets all taker can pay for with saTakerFunds, limited by saOfferPays and saOfferFunds. // --> saOfferFunds: Limit for saOfferPays -// --> saTakerFunds: Limit for saOfferGets +// --> saTakerFunds: Limit for saOfferGets : How much taker really wants. : Driver // --> saOfferPays: Request : this should be reduced as the offer is fullfilled. // --> saOfferGets: Request : this should be reduced as the offer is fullfilled. // --> saTakerPays: Total : Used to know the approximate ratio of the exchange. @@ -837,6 +837,23 @@ STAmount STAmount::deserialize(SerializerIterator& it) return ret; } +std::string STAmount::getFullText() const +{ + if (mIsNative) + { + return str(boost::format("%s " SYSTEM_CURRENCY_CODE) % getText()); + } + else + { + return str(boost::format("%s %s/%s %dE%d" ) + % getText() + % getHumanCurrency() + % NewcoinAddress::createHumanAccountID(mIssuer) + % getMantissa() + % getExponent()); + } +} + Json::Value STAmount::getJson(int) const { Json::Value elem(Json::objectValue); @@ -850,7 +867,8 @@ Json::Value STAmount::getJson(int) const if (!mIssuer.isZero()) elem["issuer"] = NewcoinAddress::createHumanAccountID(mIssuer); - }else + } + else { elem=getText(); } diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index 1c410b672b..90476e2128 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -830,7 +830,8 @@ Json::Value RPCServer::doNicknameSet(const Json::Value& params) return obj; } -// offer_create [passive] +// offer_create [passive] +// *offering* for *wants* Json::Value RPCServer::doOfferCreate(const Json::Value ¶ms) { NewcoinAddress naSeed; @@ -848,22 +849,22 @@ Json::Value RPCServer::doOfferCreate(const Json::Value ¶ms) { return RPCError(rpcSRC_ACT_MALFORMED); } - else if (!saTakerPays.setValue(params[2u].asString(), params[3u].asString())) - { - return RPCError(rpcPAYS_AMT_MALFORMED); - } - else if (!naTakerPaysID.setAccountID(params[4u].asString())) - { - return RPCError(rpcPAYS_ACT_MALFORMED); - } - else if (!saTakerGets.setValue(params[5u].asString(), params[6u].asString())) + else if (!saTakerGets.setValue(params[2u].asString(), params[3u].asString())) { return RPCError(rpcGETS_AMT_MALFORMED); } - else if (!naTakerGetsID.setAccountID(params[7u].asString())) + else if (!naTakerGetsID.setAccountID(params[4u].asString())) { return RPCError(rpcGETS_ACT_MALFORMED); } + else if (!saTakerPays.setValue(params[5u].asString(), params[6u].asString())) + { + return RPCError(rpcPAYS_AMT_MALFORMED); + } + else if (!naTakerPaysID.setAccountID(params[7u].asString())) + { + return RPCError(rpcPAYS_ACT_MALFORMED); + } else if (params.size() == 10 && params[9u].asString() != "passive") { return RPCError(rpcINVALID_PARAMS); diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index 0cd2eedebe..ee4153291f 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -261,6 +261,7 @@ public: SerializedTypeID getSType() const { return STI_AMOUNT; } std::string getText() const; std::string getRaw() const; + std::string getFullText() const; void add(Serializer& s) const; int getExponent() const { return mOffset; } diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index e73333bad7..2a08807e40 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -128,7 +128,7 @@ STAmount TransactionEngine::accountHolds(const uint160& uAccountID, const uint16 saAmount = rippleHolds(uAccountID, uCurrency, uIssuerID); Log(lsINFO) << "accountHolds: " - << saAmount.getText() + << saAmount.getFullText() << " : " << STAmount::createHumanCurrency(uCurrency) << "/" @@ -1930,11 +1930,10 @@ TransactionEngineResult TransactionEngine::doInvoice(const SerializedTransaction return tenUNKNOWN; } -// Take as much as possible. Adjusts account balances. +// 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 wanted (w/ issuer) +// --> saTakerPays: What the taker offers (w/ issuer) // --> saTakerGets: What the taker wanted (w/ issuer) -// --> saTakerFund: What taker can afford // <-- saTakerPaid: What taker paid not including fees. To reduce an offer. // <-- saTakerGot: What taker got not including fees. To reduce an offer. // <-- terResult: terSUCCESS or terNO_ACCOUNT @@ -2017,6 +2016,12 @@ TransactionEngineResult TransactionEngine::takeOffers( STAmount saOfferPays = sleOffer->getIValueFieldAmount(sfTakerGets); STAmount saOfferGets = sleOffer->getIValueFieldAmount(sfTakerPays); + if (sleOffer->getIFieldPresent(sfGetsIssuer)) + saOfferPays.setIssuer(sleOffer->getIValueFieldAccount(sfGetsIssuer).getAccountID()); + + if (sleOffer->getIFieldPresent(sfPaysIssuer)) + saOfferGets.setIssuer(sleOffer->getIValueFieldAccount(sfPaysIssuer).getAccountID()); + if (sleOffer->getIFieldPresent(sfExpiration) && sleOffer->getIFieldU32(sfExpiration) <= mLedger->getParentCloseTimeNC()) { // Offer is expired. Delete it. @@ -2037,8 +2042,7 @@ TransactionEngineResult TransactionEngine::takeOffers( { // Get offer funds available. - if (sleOffer->getIFieldPresent(sfPaysIssuer)) - saOfferPays.setIssuer(sleOffer->getIValueFieldAccount(sfPaysIssuer).getAccountID()); + Log(lsINFO) << "takeOffers: saOfferPays=" << saOfferPays.getJson(0); STAmount saOfferFunds = accountFunds(uOfferOwnerID, saOfferPays); STAmount saTakerFunds = accountFunds(uTakerAccountID, saTakerPays); @@ -2055,14 +2059,34 @@ TransactionEngineResult TransactionEngine::takeOffers( } else { + STAmount saPay = saTakerPays - saTakerPaid; + if (saTakerFunds < saPay) + saPay = saTakerFunds; STAmount saSubTakerPaid; STAmount saSubTakerGot; + Log(lsINFO) << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saTakerPaid: " << saTakerPaid.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saTakerFunds: " << saTakerFunds.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saOfferFunds: " << saOfferFunds.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saPay: " << saPay.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saOfferPays: " << saOfferPays.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saOfferGets: " << saOfferGets.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saTakerPays: " << saTakerPays.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saTakerGets: " << saTakerGets.getFullText(); + bool bOfferDelete = STAmount::applyOffer( - saOfferFunds, saTakerFunds, - saOfferPays, saOfferGets, - saTakerPays, saTakerGets, - saSubTakerPaid, saSubTakerGot); + saOfferFunds, + saPay, // Driver XXX need to account for fees. + saOfferPays, + saOfferGets, + saTakerPays, + saTakerGets, + saSubTakerPaid, + saSubTakerGot); + + Log(lsINFO) << "takeOffers: applyOffer: saSubTakerPaid: " << saSubTakerPaid.getFullText(); + Log(lsINFO) << "takeOffers: applyOffer: saSubTakerGot: " << saSubTakerGot.getFullText(); // Adjust offer if (bOfferDelete) @@ -2115,10 +2139,10 @@ Log(lsWARNING) << "doOfferCreate> " << txn.getJson(0); uint160 uGetsIssuerID = txn.getITFieldAccount(sfGetsIssuer); STAmount saTakerPays = txn.getITFieldAmount(sfTakerPays); saTakerPays.setIssuer(uPaysIssuerID); -Log(lsWARNING) << "doOfferCreate: saTakerPays=" << saTakerPays.getJson(0); +Log(lsWARNING) << "doOfferCreate: saTakerPays=" << saTakerPays.getFullText(); STAmount saTakerGets = txn.getITFieldAmount(sfTakerGets); saTakerGets.setIssuer(uGetsIssuerID); -Log(lsWARNING) << "doOfferCreate: saTakerGets=" << saTakerGets.getJson(0); +Log(lsWARNING) << "doOfferCreate: saTakerGets=" << saTakerGets.getFullText(); uint32 uExpiration = txn.getITFieldU32(sfExpiration); bool bHaveExpiration = txn.getITFieldPresent(sfExpiration); uint32 uSequence = txn.getSequence(); @@ -2218,21 +2242,23 @@ Log(lsWARNING) << "doOfferCreate: saTakerGets=" << saTakerGets.getJson(0); ); Log(lsWARNING) << "doOfferCreate: takeOffers=" << terResult; - Log(lsWARNING) << "doOfferCreate: takeOffers: saOfferPaid=" << saOfferPaid.getText(); - Log(lsWARNING) << "doOfferCreate: takeOffers: saOfferGot=" << saOfferGot.getText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saOfferPaid=" << saOfferPaid.getFullText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saOfferGot=" << saOfferGot.getFullText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerPays=" << saTakerPays.getFullText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerGets=" << saTakerGets.getFullText(); if (terSUCCESS == terResult) { - saTakerGets -= saOfferPaid; // Reduce payout to takers by what srcAccount just paid. saTakerPays -= saOfferGot; // Reduce payin from takers by what offer just got. + saTakerGets -= saOfferPaid; // Reduce payout to takers by what srcAccount just paid. } } - Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerPays=" << saTakerPays.getText(); - Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerGets=" << saTakerGets.getJson(0); - Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerGets=" << NewcoinAddress::createHumanAccountID(saTakerGets.getIssuer()); + Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerPays=" << saTakerPays.getFullText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerGets=" << saTakerGets.getFullText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: saTakerGets=" << NewcoinAddress::createHumanAccountID(saTakerGets.getIssuer()); Log(lsWARNING) << "doOfferCreate: takeOffers: mTxnAccountID=" << NewcoinAddress::createHumanAccountID(mTxnAccountID); - Log(lsWARNING) << "doOfferCreate: takeOffers: funds=" << accountFunds(mTxnAccountID, saTakerGets).getText(); + Log(lsWARNING) << "doOfferCreate: takeOffers: funds=" << accountFunds(mTxnAccountID, saTakerGets).getFullText(); // Log(lsWARNING) << "doOfferCreate: takeOffers: uPaysIssuerID=" << NewcoinAddress::createHumanAccountID(uPaysIssuerID); // Log(lsWARNING) << "doOfferCreate: takeOffers: uGetsIssuerID=" << NewcoinAddress::createHumanAccountID(uGetsIssuerID);