[amount] Add support for negative fee rates
Currently negative fee rates are not supported on archs of 64-bit or more
This commit is contained in:
parent
11114a69c8
commit
fa2da2cb60
2 changed files with 22 additions and 9 deletions
|
@ -9,20 +9,30 @@
|
||||||
|
|
||||||
const std::string CURRENCY_UNIT = "BTC";
|
const std::string CURRENCY_UNIT = "BTC";
|
||||||
|
|
||||||
CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nSize)
|
CFeeRate::CFeeRate(const CAmount& nFeePaid, size_t nBytes_)
|
||||||
{
|
{
|
||||||
|
assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
|
||||||
|
int64_t nSize = int64_t(nBytes_);
|
||||||
|
|
||||||
if (nSize > 0)
|
if (nSize > 0)
|
||||||
nSatoshisPerK = nFeePaid*1000/nSize;
|
nSatoshisPerK = nFeePaid * 1000 / nSize;
|
||||||
else
|
else
|
||||||
nSatoshisPerK = 0;
|
nSatoshisPerK = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
CAmount CFeeRate::GetFee(size_t nSize) const
|
CAmount CFeeRate::GetFee(size_t nBytes_) const
|
||||||
{
|
{
|
||||||
|
assert(nBytes_ <= uint64_t(std::numeric_limits<int64_t>::max()));
|
||||||
|
int64_t nSize = int64_t(nBytes_);
|
||||||
|
|
||||||
CAmount nFee = nSatoshisPerK * nSize / 1000;
|
CAmount nFee = nSatoshisPerK * nSize / 1000;
|
||||||
|
|
||||||
if (nFee == 0 && nSize != 0 && nSatoshisPerK > 0)
|
if (nFee == 0 && nSize != 0) {
|
||||||
|
if (nSatoshisPerK > 0)
|
||||||
nFee = CAmount(1);
|
nFee = CAmount(1);
|
||||||
|
if (nSatoshisPerK < 0)
|
||||||
|
nFee = CAmount(-1);
|
||||||
|
}
|
||||||
|
|
||||||
return nFee;
|
return nFee;
|
||||||
}
|
}
|
||||||
|
|
11
src/amount.h
11
src/amount.h
|
@ -11,6 +11,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
/** Amount in satoshis (Can be negative) */
|
||||||
typedef int64_t CAmount;
|
typedef int64_t CAmount;
|
||||||
|
|
||||||
static const CAmount COIN = 100000000;
|
static const CAmount COIN = 100000000;
|
||||||
|
@ -30,22 +31,24 @@ extern const std::string CURRENCY_UNIT;
|
||||||
static const CAmount MAX_MONEY = 21000000 * COIN;
|
static const CAmount MAX_MONEY = 21000000 * COIN;
|
||||||
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
|
||||||
|
|
||||||
/** Type-safe wrapper class for fee rates
|
/**
|
||||||
* (how much to pay based on transaction size)
|
* Fee rate in satoshis per kilobyte: CAmount / kB
|
||||||
*/
|
*/
|
||||||
class CFeeRate
|
class CFeeRate
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
CAmount nSatoshisPerK; // unit is satoshis-per-1,000-bytes
|
CAmount nSatoshisPerK; // unit is satoshis-per-1,000-bytes
|
||||||
public:
|
public:
|
||||||
|
/** Fee rate of 0 satoshis per kB */
|
||||||
CFeeRate() : nSatoshisPerK(0) { }
|
CFeeRate() : nSatoshisPerK(0) { }
|
||||||
explicit CFeeRate(const CAmount& _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) { }
|
explicit CFeeRate(const CAmount& _nSatoshisPerK): nSatoshisPerK(_nSatoshisPerK) { }
|
||||||
CFeeRate(const CAmount& nFeePaid, size_t nSize);
|
/** Constructor for a fee rate in satoshis per kB. The size in bytes must not exceed (2^63 - 1)*/
|
||||||
|
CFeeRate(const CAmount& nFeePaid, size_t nBytes);
|
||||||
CFeeRate(const CFeeRate& other) { nSatoshisPerK = other.nSatoshisPerK; }
|
CFeeRate(const CFeeRate& other) { nSatoshisPerK = other.nSatoshisPerK; }
|
||||||
/**
|
/**
|
||||||
* Return the fee in satoshis for the given size in bytes.
|
* Return the fee in satoshis for the given size in bytes.
|
||||||
*/
|
*/
|
||||||
CAmount GetFee(size_t size) const;
|
CAmount GetFee(size_t nBytes) const;
|
||||||
/**
|
/**
|
||||||
* Return the fee in satoshis for a size of 1000 bytes
|
* Return the fee in satoshis for a size of 1000 bytes
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue