mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Add a new algorithm for finding the liquidity in a payment path. There is still a reverse and forward pass, but the forward pass starts at the limiting step rather than the payment source. This insures the limiting step is completely consumed rather than potentially leaving a 'dust' amount in the forward pass. Each step in a payment is either a book step, a direct step (account to account step), or an xrp endpoint. Each step in the existing implementation is a triple, where each element in the triple is either an account of a book, for a total of eight step types. Since accounts are considered in pairs, rather than triples, transfer fees are handled differently. In V1 of payments, in the payment path A -> gw ->B, if A redeems to gw, and gw issues to B, a transfer fee is changed. In the new code, a transfer fee is changed even if A issues to gw.
111 lines
2.9 KiB
C++
111 lines
2.9 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of rippled: https://github.com/ripple/rippled
|
|
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef RIPPLE_PROTOCOL_AMOUNTCONVERSION_H_INCLUDED
|
|
#define RIPPLE_PROTOCOL_AMOUNTCONVERSION_H_INCLUDED
|
|
|
|
#include <ripple/protocol/IOUAmount.h>
|
|
#include <ripple/protocol/XRPAmount.h>
|
|
#include <ripple/protocol/STAmount.h>
|
|
|
|
namespace ripple {
|
|
|
|
inline
|
|
STAmount
|
|
toSTAmount (IOUAmount const& iou, Issue const& iss)
|
|
{
|
|
bool const isNeg = iou.signum() < 0;
|
|
std::uint64_t const umant = isNeg ? - iou.mantissa () : iou.mantissa ();
|
|
return STAmount (iss, umant, iou.exponent (), /*native*/ false, isNeg,
|
|
STAmount::unchecked ());
|
|
}
|
|
|
|
inline
|
|
STAmount
|
|
toSTAmount (IOUAmount const& iou)
|
|
{
|
|
return toSTAmount (iou, noIssue ());
|
|
}
|
|
|
|
inline
|
|
STAmount
|
|
toSTAmount (XRPAmount const& xrp)
|
|
{
|
|
bool const isNeg = xrp.signum() < 0;
|
|
std::uint64_t const umant = isNeg ? - xrp.drops () : xrp.drops ();
|
|
return STAmount (umant, isNeg);
|
|
}
|
|
|
|
inline
|
|
STAmount
|
|
toSTAmount (XRPAmount const& xrp, Issue const& iss)
|
|
{
|
|
assert (isXRP(iss.account) && isXRP(iss.currency));
|
|
return toSTAmount (xrp);
|
|
}
|
|
|
|
template <class T>
|
|
T
|
|
toAmount (STAmount const& amt)
|
|
{
|
|
static_assert(sizeof(T) == -1, "Must use specialized function");
|
|
return T(0);
|
|
}
|
|
|
|
template <>
|
|
inline
|
|
STAmount
|
|
toAmount<STAmount> (STAmount const& amt)
|
|
{
|
|
return amt;
|
|
}
|
|
|
|
template <>
|
|
inline
|
|
IOUAmount
|
|
toAmount<IOUAmount> (STAmount const& amt)
|
|
{
|
|
assert (amt.mantissa () < std::numeric_limits<std::int64_t>::max ());
|
|
bool const isNeg = amt.negative ();
|
|
std::int64_t const sMant =
|
|
isNeg ? - std::int64_t (amt.mantissa ()) : amt.mantissa ();
|
|
|
|
assert (! isXRP (amt));
|
|
return IOUAmount (sMant, amt.exponent ());
|
|
}
|
|
|
|
template <>
|
|
inline
|
|
XRPAmount
|
|
toAmount<XRPAmount> (STAmount const& amt)
|
|
{
|
|
assert (amt.mantissa () < std::numeric_limits<std::int64_t>::max ());
|
|
bool const isNeg = amt.negative ();
|
|
std::int64_t const sMant =
|
|
isNeg ? - std::int64_t (amt.mantissa ()) : amt.mantissa ();
|
|
|
|
assert (isXRP (amt));
|
|
return XRPAmount (sMant);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#endif
|