Merge branch 'fixclient535' into develop

This commit is contained in:
Arthur Britto
2013-05-06 20:12:58 -07:00
4 changed files with 201 additions and 120 deletions

View File

@@ -597,6 +597,7 @@ std::string STAmount::getRaw() const
std::string STAmount::getText() const
{ // keep full internal accuracy, but make more human friendly if posible
if (isZero()) return "0";
if (mIsNative)
{
if (mIsNegative)

View File

@@ -225,8 +225,10 @@ TER PathState::pushNode(
: !!pnCur.uCurrencyID
? uAccountID
: ACCOUNT_XRP;
pnCur.saRevRedeem = STAmount(uCurrencyID, uAccountID);
pnCur.saRevIssue = STAmount(uCurrencyID, uAccountID);
pnCur.saRevRedeem = STAmount(pnCur.uCurrencyID, uAccountID);
pnCur.saRevIssue = STAmount(pnCur.uCurrencyID, uAccountID);
pnCur.saRevDeliver = STAmount(pnCur.uCurrencyID, pnCur.uIssuerID);
pnCur.saFwdDeliver = pnCur.saRevDeliver;
if (bFirst)
{
@@ -311,8 +313,8 @@ TER PathState::pushNode(
&& -saOwed >= (saLimit = lesEntries.rippleLimit(pnCur.uAccountID, pnBck.uAccountID, pnCur.uCurrencyID)))
{
cLog(lsWARNING) << boost::str(boost::format("pushNode: dry: saOwed=%s saLimit=%s")
% saOwed.getFullText()
% saLimit.getFullText());
% saOwed
% saLimit);
terResult = tecPATH_DRY;
}
@@ -338,6 +340,8 @@ TER PathState::pushNode(
: pnPrv.uAccountID // Or previous account if no previous issuer.
: ACCOUNT_XRP;
pnCur.saRateMax = saZero;
pnCur.saRevDeliver = STAmount(pnCur.uCurrencyID, pnCur.uIssuerID);
pnCur.saFwdDeliver = pnCur.saRevDeliver;
if (!!pnCur.uCurrencyID != !!pnCur.uIssuerID)
{
@@ -1150,9 +1154,10 @@ TER RippleCalc::calcNodeDeliverRev(
// YYY Note this gets zeroed on each increment, ideally only on first increment, then it could be a limit on the forward pass.
saOutAct.zero(saOutReq);
cLog(lsINFO) << boost::str(boost::format("calcNodeDeliverRev: saOutAct=%s saOutReq=%s")
cLog(lsINFO) << boost::str(boost::format("calcNodeDeliverRev> saOutAct=%s saOutReq=%s saPrvDlvReq=%s")
% saOutAct
% saOutReq);
% saOutReq
% saPrvDlvReq);
assert(!!saOutReq);
@@ -1383,11 +1388,16 @@ TER RippleCalc::calcNodeDeliverRev(
<< boost::str(boost::format("calcNodeDeliverRev: TOO MUCH: saOutAct=%s saOutReq=%s")
% saOutAct
% saOutReq);
assert(saOutAct <= saOutReq);
// XXX Perhaps need to check if partial is okay to relax this?
if (tesSUCCESS == terResult && !saOutAct)
terResult = tecPATH_DRY; // Unable to meet request, consider path dry.
cLog(lsINFO) << boost::str(boost::format("calcNodeDeliverRev< saOutAct=%s saOutReq=%s saPrvDlvReq=%s")
% saOutAct
% saOutReq
% saPrvDlvReq);
return terResult;
}
@@ -1684,34 +1694,6 @@ TER RippleCalc::calcNodeOfferRev(
// Next is an account node, resolve current offer node's deliver.
STAmount saDeliverAct;
// For each offer node in the sequence clear saRevDeliver and the previous saFwdDeliver.
for (unsigned int uIndex = uNode; uIndex;)
{
PaymentNode& pnClrCur = psCur.vpnNodes[uIndex];
PaymentNode& pnClrPrv = psCur.vpnNodes[uIndex-1];
if (!pnClrCur.uAccountID)
{
// An offer.
// Reverse pass.
// Current entry is previously calculated.
// Clear prior entries which are derived.
pnClrPrv.saRevDeliver.zero(pnClrPrv.uCurrencyID, pnClrPrv.uIssuerID);
// Clear deliver entry to be added to in forward pass.
pnClrCur.saFwdDeliver.zero(pnClrCur.uCurrencyID, pnClrCur.uIssuerID);
--uIndex;
}
else
{
// A non-offer.
uIndex = 0; // Done.
}
}
cLog(lsINFO) << boost::str(boost::format("calcNodeOfferRev: OFFER --> account: uNode=%d saRevDeliver=%s")
% uNode
% pnCur.saRevDeliver);
@@ -1804,13 +1786,15 @@ void RippleCalc::calcNodeRipple(
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple> uQualityIn=%d uQualityOut=%d saPrvReq=%s saCurReq=%s saPrvAct=%s saCurAct=%s")
% uQualityIn
% uQualityOut
% saPrvReq.getFullText()
% saCurReq.getFullText()
% saPrvAct.getFullText()
% saCurAct.getFullText());
% saPrvReq
% saCurReq
% saPrvAct
% saCurAct);
assert(saCurReq.isPositive());
assert(saPrvReq.getCurrency() == saCurReq.getCurrency());
assert(saPrvReq.getCurrency() == saPrvAct.getCurrency());
assert(saPrvReq.getIssuer() == saPrvAct.getIssuer());
const bool bPrvUnlimited = saPrvReq.isNegative();
const STAmount saPrv = bPrvUnlimited ? STAmount(saPrvReq) : saPrvReq-saPrvAct;
@@ -1819,8 +1803,8 @@ void RippleCalc::calcNodeRipple(
#if 0
cLog(lsINFO) << boost::str(boost::format("calcNodeRipple: bPrvUnlimited=%d saPrv=%s saCur=%s")
% bPrvUnlimited
% saPrv.getFullText()
% saCur.getFullText());
% saPrv
% saCur);
#endif
if (uQualityIn >= uQualityOut)
@@ -1859,19 +1843,19 @@ void RippleCalc::calcNodeRipple(
STAmount saCurIn = STAmount::divRound(STAmount::mulRound(saCur, uQualityOut, uCurrencyID, uCurIssuerID, true), uQualityIn, uCurrencyID, uCurIssuerID, true);
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple: bPrvUnlimited=%d saPrv=%s saCurIn=%s") % bPrvUnlimited % saPrv.getFullText() % saCurIn.getFullText());
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple: bPrvUnlimited=%d saPrv=%s saCurIn=%s") % bPrvUnlimited % saPrv % saCurIn);
if (bPrvUnlimited || saCurIn <= saPrv)
{
// All of cur. Some amount of prv.
saCurAct += saCur;
saPrvAct += saCurIn;
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple:3c: saCurReq=%s saPrvAct=%s") % saCurReq.getFullText() % saPrvAct.getFullText());
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple:3c: saCurReq=%s saPrvAct=%s") % saCurReq % saPrvAct);
}
else
{
// A part of cur. All of prv. (cur as driver)
STAmount saCurOut = STAmount::divRound(STAmount::mulRound(saPrv, uQualityIn, uCurrencyID, uCurIssuerID, true), uQualityOut, uCurrencyID, uCurIssuerID, true);
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple:4: saCurReq=%s") % saCurReq.getFullText());
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple:4: saCurReq=%s") % saCurReq);
saCurAct += saCurOut;
saPrvAct = saPrvReq;
@@ -1885,10 +1869,10 @@ void RippleCalc::calcNodeRipple(
cLog(lsTRACE) << boost::str(boost::format("calcNodeRipple< uQualityIn=%d uQualityOut=%d saPrvReq=%s saCurReq=%s saPrvAct=%s saCurAct=%s")
% uQualityIn
% uQualityOut
% saPrvReq.getFullText()
% saCurReq.getFullText()
% saPrvAct.getFullText()
% saCurAct.getFullText());
% saPrvReq
% saCurReq
% saPrvAct
% saCurAct);
}
// Calculate saPrvRedeemReq, saPrvIssueReq, saPrvDeliver from saCur...
@@ -1945,11 +1929,11 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
% STAmount::createHumanCurrency(uCurrencyID)
% uQualityIn
% uQualityOut
% saPrvOwed.getFullText()
% saPrvLimit.getFullText());
% saPrvOwed
% saPrvLimit);
// Previous can redeem the owed IOUs it holds.
const STAmount saPrvRedeemReq = saPrvOwed.isPositive() ? saPrvOwed : STAmount(uCurrencyID, 0);
const STAmount saPrvRedeemReq = saPrvOwed.isPositive() ? saPrvOwed : STAmount(saPrvOwed.getCurrency(), saPrvOwed.getIssuer());
STAmount& saPrvRedeemAct = pnPrv.saRevRedeem;
// Previous can issue up to limit minus whatever portion of limit already used (not including redeemable amount).
@@ -1957,7 +1941,7 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
STAmount& saPrvIssueAct = pnPrv.saRevIssue;
// For !bPrvAccount
const STAmount saPrvDeliverReq = STAmount(uCurrencyID, uCurAccountID, -1); // Unlimited.
const STAmount saPrvDeliverReq = STAmount(pnPrv.saRevDeliver.getCurrency(), pnPrv.saRevDeliver.getIssuer(), -1); // Unlimited.
STAmount& saPrvDeliverAct = pnPrv.saRevDeliver;
// For bNxtAccount
@@ -1971,12 +1955,14 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
const STAmount& saCurDeliverReq = pnCur.saRevDeliver;
STAmount saCurDeliverAct(saCurDeliverReq.getCurrency(), saCurDeliverReq.getIssuer());
cLog(lsTRACE) << boost::str(boost::format("calcNodeAccountRev: saPrvRedeemReq=%s saPrvIssueReq=%s saCurRedeemReq=%s saCurIssueReq=%s saNxtOwed=%s")
% saPrvRedeemReq.getFullText()
% saPrvIssueReq.getFullText()
% saCurRedeemReq.getFullText()
% saCurIssueReq.getFullText()
% saNxtOwed.getFullText());
cLog(lsTRACE) << boost::str(boost::format("calcNodeAccountRev: saPrvRedeemReq=%s saPrvIssueReq=%s saPrvDeliverAct=%s saPrvDeliverReq=%s saCurRedeemReq=%s saCurIssueReq=%s saNxtOwed=%s")
% saPrvRedeemReq
% saPrvIssueReq
% saPrvDeliverAct
% saPrvDeliverReq
% saCurRedeemReq
% saCurIssueReq
% saNxtOwed);
cLog(lsTRACE) << psCur.getJson();
@@ -1998,11 +1984,12 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
{
// account --> ACCOUNT --> $
// Overall deliverable.
const STAmount& saCurWantedReq = std::min(psCur.saOutReq-psCur.saOutAct, saPrvLimit+saPrvOwed); // If previous is an account, limit.
const STAmount saCurWantedReq = std::min(psCur.saOutReq-psCur.saOutAct, saPrvLimit+saPrvOwed); // If previous is an account, limit.
STAmount saCurWantedAct(saCurWantedReq.getCurrency(), saCurWantedReq.getIssuer());
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: account --> ACCOUNT --> $ : saCurWantedReq=%s")
% saCurWantedReq.getFullText());
% saCurWantedReq);
// Calculate redeem
if (saPrvRedeemReq) // Previous has IOUs to redeem.
@@ -2015,17 +2002,17 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
uRateMax = STAmount::uRateOne;
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: Redeem at 1:1 saPrvRedeemReq=%s (available) saPrvRedeemAct=%s uRateMax=%s")
% saPrvRedeemReq.getFullText()
% saPrvRedeemAct.getFullText()
% saPrvRedeemReq
% saPrvRedeemAct
% STAmount::saFromRate(uRateMax).getText());
}
else
{
saPrvRedeemAct.zero(saCurWantedAct);
saPrvRedeemAct.zero(saPrvRedeemReq);
}
// Calculate issuing.
saPrvIssueAct.zero(saCurWantedAct);
saPrvIssueAct.zero(saPrvIssueReq);
if (saCurWantedReq != saCurWantedAct // Need more.
&& saPrvIssueReq) // Will accept IOUs from prevous.
@@ -2036,8 +2023,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
calcNodeRipple(uQualityIn, QUALITY_ONE, saPrvIssueReq, saCurWantedReq, saPrvIssueAct, saCurWantedAct, uRateMax);
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: Issuing: Rate: quality in : 1.0 saPrvIssueAct=%s saCurWantedAct=%s")
% saPrvIssueAct.getFullText()
% saCurWantedAct.getFullText());
% saPrvIssueAct
% saCurWantedAct);
}
if (!saCurWantedAct)
@@ -2049,8 +2036,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
else
{
// ^|account --> ACCOUNT --> account
saPrvRedeemAct.zero(saCurRedeemReq);
saPrvIssueAct.zero(saCurRedeemReq);
saPrvRedeemAct.zero(saPrvRedeemReq);
saPrvIssueAct.zero(saPrvIssueReq);
// redeem (part 1) -> redeem
if (saCurRedeemReq // Next wants IOUs redeemed.
@@ -2060,8 +2047,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
calcNodeRipple(QUALITY_ONE, uQualityOut, saPrvRedeemReq, saCurRedeemReq, saPrvRedeemAct, saCurRedeemAct, uRateMax);
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: Rate : 1.0 : quality out saPrvRedeemAct=%s saCurRedeemAct=%s")
% saPrvRedeemAct.getFullText()
% saCurRedeemAct.getFullText());
% saPrvRedeemAct
% saCurRedeemAct);
}
// issue (part 1) -> redeem
@@ -2072,8 +2059,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
calcNodeRipple(uQualityIn, uQualityOut, saPrvIssueReq, saCurRedeemReq, saPrvIssueAct, saCurRedeemAct, uRateMax);
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: Rate: quality in : quality out: saPrvIssueAct=%s saCurRedeemAct=%s")
% saPrvIssueAct.getFullText()
% saCurRedeemAct.getFullText());
% saPrvIssueAct
% saCurRedeemAct);
}
// redeem (part 2) -> issue.
@@ -2085,8 +2072,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
calcNodeRipple(QUALITY_ONE, lesActive.rippleTransferRate(uCurAccountID), saPrvRedeemReq, saCurIssueReq, saPrvRedeemAct, saCurIssueAct, uRateMax);
cLog(lsINFO) << boost::str(boost::format("calcNodeAccountRev: Rate : 1.0 : transfer_rate: saPrvRedeemAct=%s saCurIssueAct=%s")
% saPrvRedeemAct.getFullText()
% saCurIssueAct.getFullText());
% saPrvRedeemAct
% saCurIssueAct);
}
// issue (part 2) -> issue
@@ -2099,8 +2086,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
calcNodeRipple(uQualityIn, QUALITY_ONE, saPrvIssueReq, saCurIssueReq, saPrvIssueAct, saCurIssueAct, uRateMax);
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: Rate: quality in : 1.0: saPrvIssueAct=%s saCurIssueAct=%s")
% saPrvIssueAct.getFullText()
% saCurIssueAct.getFullText());
% saPrvIssueAct
% saCurIssueAct);
}
if (!saCurRedeemAct && !saCurIssueAct)
@@ -2110,11 +2097,11 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
}
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: ^|account --> ACCOUNT --> account : saCurRedeemReq=%s saCurIssueReq=%s saPrvOwed=%s saCurRedeemAct=%s saCurIssueAct=%s")
% saCurRedeemReq.getFullText()
% saCurIssueReq.getFullText()
% saPrvOwed.getFullText()
% saCurRedeemAct.getFullText()
% saCurIssueAct.getFullText());
% saCurRedeemReq
% saCurIssueReq
% saPrvOwed
% saCurRedeemAct
% saCurIssueAct);
}
}
else if (bPrvAccount && !bNxtAccount)
@@ -2123,8 +2110,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
// Note: deliver is always issue as ACCOUNT is the issuer for the offer input.
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: account --> ACCOUNT --> offer"));
saPrvRedeemAct.zero(saCurRedeemReq);
saPrvIssueAct.zero(saCurRedeemReq);
saPrvRedeemAct.zero(saPrvRedeemReq);
saPrvIssueAct.zero(saPrvIssueReq);
// redeem -> deliver/issue.
if (saPrvOwed.isPositive() // Previous has IOUs to redeem.
@@ -2149,14 +2136,12 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
}
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: saCurDeliverReq=%s saCurDeliverAct=%s saPrvOwed=%s")
% saCurDeliverReq.getFullText()
% saCurDeliverAct.getFullText()
% saPrvOwed.getFullText());
% saCurDeliverReq
% saCurDeliverAct
% saPrvOwed);
}
else if (!bPrvAccount && bNxtAccount)
{
saPrvDeliverAct.zero(saCurRedeemReq);
if (uNode == uLast)
{
// offer --> ACCOUNT --> $
@@ -2164,7 +2149,7 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
STAmount saCurWantedAct(saCurWantedReq.getCurrency(), saCurWantedReq.getIssuer());
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: offer --> ACCOUNT --> $ : saCurWantedReq=%s saOutAct=%s saOutReq=%s")
% saCurWantedReq.getFullText()
% saCurWantedReq
% psCur.saOutAct
% psCur.saOutReq);
@@ -2189,7 +2174,8 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
{
// offer --> ACCOUNT --> account
// Note: offer is always delivering(redeeming) as account is issuer.
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: offer --> ACCOUNT --> account"));
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: offer --> ACCOUNT --> account : saCurRedeemReq=%s saCurIssueReq=%s")
% saCurRedeemReq % saCurIssueReq);
// deliver -> redeem
if (saCurRedeemReq) // Next wants us to redeem.
@@ -2225,8 +2211,6 @@ TER RippleCalc::calcNodeAccountRev(const unsigned int uNode, PathState& psCur, c
// deliver/redeem -> deliver/issue.
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountRev: offer --> ACCOUNT --> offer"));
saPrvDeliverAct.zero(saCurRedeemReq);
// Rate : 1.0 : transfer_rate
calcNodeRipple(QUALITY_ONE, lesActive.rippleTransferRate(uCurAccountID), saPrvDeliverReq, saCurDeliverReq, saPrvDeliverAct, saCurDeliverAct, uRateMax);
@@ -2310,12 +2294,12 @@ TER RippleCalc::calcNodeAccountFwd(
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountFwd> uNode=%d/%d saPrvRedeemReq=%s saPrvIssueReq=%s saPrvDeliverReq=%s saCurRedeemReq=%s saCurIssueReq=%s saCurDeliverReq=%s")
% uNode
% uLast
% saPrvRedeemReq.getFullText()
% saPrvIssueReq.getFullText()
% saPrvDeliverReq.getFullText()
% saCurRedeemReq.getFullText()
% saCurIssueReq.getFullText()
% saCurDeliverReq.getFullText());
% saPrvRedeemReq
% saPrvIssueReq
% saPrvDeliverReq
% saCurRedeemReq
% saCurIssueReq
% saCurDeliverReq);
// Ripple through account.
@@ -2352,12 +2336,12 @@ TER RippleCalc::calcNodeAccountFwd(
saCurSendMaxPass += saCurIssueAct;
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountFwd: ^ --> ACCOUNT --> account : saInReq=%s saInAct=%s saCurRedeemAct=%s saCurIssueReq=%s saCurIssueAct=%s saCurSendMaxPass=%s")
% psCur.saInReq.getFullText()
% psCur.saInAct.getFullText()
% saCurRedeemAct.getFullText()
% saCurIssueReq.getFullText()
% saCurIssueAct.getFullText()
% saCurSendMaxPass.getFullText());
% psCur.saInReq
% psCur.saInAct
% saCurRedeemAct
% saCurIssueReq
% saCurIssueAct
% saCurSendMaxPass);
}
else if (uNode == uLast)
{
@@ -2365,8 +2349,8 @@ TER RippleCalc::calcNodeAccountFwd(
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountFwd: account --> ACCOUNT --> $ : uPrvAccountID=%s uCurAccountID=%s saPrvRedeemReq=%s saPrvIssueReq=%s")
% RippleAddress::createHumanAccountID(uPrvAccountID)
% RippleAddress::createHumanAccountID(uCurAccountID)
% saPrvRedeemReq.getFullText()
% saPrvIssueReq.getFullText());
% saPrvRedeemReq
% saPrvIssueReq);
// Last node. Accept all funds. Calculate amount actually to credit.
@@ -2523,7 +2507,7 @@ TER RippleCalc::calcNodeAccountFwd(
if (uNode == uLast)
{
// offer --> ACCOUNT --> $
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountFwd: offer --> ACCOUNT --> $ : %s") % saPrvDeliverReq.getFullText());
cLog(lsDEBUG) << boost::str(boost::format("calcNodeAccountFwd: offer --> ACCOUNT --> $ : %s") % saPrvDeliverReq);
STAmount& saCurReceive = psCur.saOutPass;
@@ -2633,7 +2617,7 @@ TER RippleCalc::calcNodeRev(const unsigned int uNode, PathState& psCur, const bo
% uNode
% bCurAccount
% RippleAddress::createHumanAccountID(uCurIssuerID)
% saTransferRate.getFullText());
% saTransferRate);
terResult = bCurAccount
? calcNodeAccountRev(uNode, psCur, bMultiQuality)
@@ -2697,8 +2681,8 @@ void RippleCalc::pathNext(PathState::ref psrCur, const bool bMultiQuality, const
{
tLog(!psrCur->saInPass || !psrCur->saOutPass, lsDEBUG)
<< boost::str(boost::format("pathNext: Error calcNodeFwd reported success for nothing: saOutPass=%s saInPass=%s")
% psrCur->saOutPass.getFullText()
% psrCur->saInPass.getFullText());
% psrCur->saOutPass
% psrCur->saInPass);
if (!psrCur->saOutPass || !psrCur->saInPass)
throw std::runtime_error("Made no progress.");
@@ -2744,8 +2728,8 @@ TER RippleCalc::rippleCalc(
RippleCalc rc(lesActive, bOpenLedger);
cLog(lsTRACE) << boost::str(boost::format("rippleCalc> saMaxAmountReq=%s saDstAmountReq=%s")
% saMaxAmountReq.getFullText()
% saDstAmountReq.getFullText());
% saMaxAmountReq
% saDstAmountReq);
TER terResult = temUNCERTAIN;
@@ -2805,8 +2789,8 @@ cLog(lsDEBUG) << boost::str(boost::format("rippleCalc: Build direct: status: %s"
return temUNKNOWN;
cLog(lsTRACE) << boost::str(boost::format("rippleCalc: EXPAND: saDstAmountReq=%s saMaxAmountReq=%s uDstAccountID=%s uSrcAccountID=%s")
% saDstAmountReq.getFullText()
% saMaxAmountReq.getFullText()
% saDstAmountReq
% saMaxAmountReq
% RippleAddress::createHumanAccountID(uDstAccountID)
% RippleAddress::createHumanAccountID(uSrcAccountID));
@@ -2898,8 +2882,8 @@ int iPass = 0;
tLog(!pspCur->saInPass || !pspCur->saOutPass, lsDEBUG)
<< boost::str(boost::format("rippleCalc: better: uQuality=%s saInPass=%s saOutPass=%s")
% STAmount::saFromRate(pspCur->uQuality)
% pspCur->saInPass.getFullText()
% pspCur->saOutPass.getFullText());
% pspCur->saInPass
% pspCur->saOutPass);
assert(!!pspCur->saInPass && !!pspCur->saOutPass);
@@ -2911,8 +2895,8 @@ int iPass = 0;
% pspCur->mIndex
% pspCur->uQuality
% STAmount::saFromRate(pspCur->uQuality)
% pspCur->saInPass.getFullText()
% pspCur->saOutPass.getFullText());
% pspCur->saInPass
% pspCur->saOutPass);
assert(lesActive.isValid());
lesActive.swapWith(pspCur->lesEntries); // For the path, save ledger state.
@@ -2945,8 +2929,8 @@ int iPass = 0;
cLog(lsDEBUG) << boost::str(boost::format("rippleCalc: best: uQuality=%s saInPass=%s saOutPass=%s")
% STAmount::saFromRate(pspBest->uQuality)
% pspBest->saInPass.getFullText()
% pspBest->saOutPass.getFullText());
% pspBest->saInPass
% pspBest->saOutPass);
// Record best pass' offers that became unfunded for deletion on success.
vuUnfundedBecame.insert(vuUnfundedBecame.end(), pspBest->vUnfundedBecame.begin(), pspBest->vUnfundedBecame.end());

View File

@@ -1738,4 +1738,100 @@ buster.testCase("Offer tfSell", {
});
},
});
buster.testCase("Client Issue #535", {
'setUp' : testutils.build_setup(),
// 'setUp' : testutils.build_setup({ verbose: true }),
// 'setUp' : testutils.build_setup({ verbose: true, standalone: true }),
'tearDown' : testutils.build_teardown(),
"gateway cross currency" :
function (done) {
var self = this;
var final_create;
async.waterfall([
function (callback) {
// Provide micro amounts to compensate for fees to make results round nice.
self.what = "Create accounts.";
testutils.create_accounts(self.remote, "root", "350.000020", ["alice", "bob", "mtgox"], callback);
},
function (callback) {
self.what = "Set limits.";
testutils.credit_limits(self.remote,
{
"alice" : [ "1000/XTS/mtgox", "1000/XXX/mtgox" ],
"bob" : [ "1000/XTS/mtgox", "1000/XXX/mtgox" ],
},
callback);
},
function (callback) {
self.what = "Distribute funds.";
testutils.payments(self.remote,
{
"mtgox" : [ "100/XTS/alice", "100/XXX/alice", "100/XTS/bob", "100/XXX/bob", ],
},
callback);
},
function (callback) {
self.what = "Create offer alice.";
self.remote.transaction()
.offer_create("alice", "100/XTS/mtgox", "100/XXX/mtgox")
.on('proposed', function (m) {
// console.log("proposed: offer_create: %s", json.stringify(m));
callback(m.result !== 'tesSUCCESS');
seq_carol = m.tx_json.sequence;
})
.submit();
},
function (callback) {
self.what = "Bob converts XTS to XXX.";
self.remote.transaction()
.payment("bob", "bob", "1/XXX/bob")
.send_max("1.5/XTS/bob")
.build_path(true)
.on('proposed', function (m) {
if (m.result !== 'tesSUCCESS')
console.log("proposed: %s", JSON.stringify(m, undefined, 2));
callback(m.result !== 'tesSUCCESS');
})
.submit();
},
// function (callback) {
// self.what = "Display ledger";
//
// self.remote.request_ledger('current', true)
// .on('success', function (m) {
// console.log("Ledger: %s", JSON.stringify(m, undefined, 2));
//
// callback();
// })
// .request();
// },
function (callback) {
self.what = "Verify balances.";
testutils.verify_balances(self.remote,
{
"alice" : [ "101/XTS/mtgox", "99/XXX/mtgox", ],
"bob" : [ "99/XTS/mtgox", "101/XXX/mtgox", ],
},
callback);
},
], function (error) {
if (error)
console.log("result: %s: error=%s", self.what, error);
buster.refute(error);
done();
});
}
});
// vim:sw=2:sts=2:ts=8:et

View File

@@ -1048,8 +1048,8 @@ buster.testCase("Gateway", {
});
buster.testCase("Indirect ripple", {
// 'setUp' : testutils.build_setup({ verbose: true }),
'setUp' : testutils.build_setup(),
// 'setUp' : testutils.build_setup({ verbose: true }),
'tearDown' : testutils.build_teardown(),
"indirect ripple" :