aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoss Nicoll <[email protected]>2018-01-01 16:24:14 +0000
committerRoss Nicoll <[email protected]>2018-09-19 19:24:06 +0100
commitc6eeab75a1c70b6ad63854e036e5843b7f104d31 (patch)
treed7e369806b4e5d386820ea031c5cc5083076afbe /src
parentUpdate checkpoints and chain work (#1410) (diff)
downloaddiscoin-c6eeab75a1c70b6ad63854e036e5843b7f104d31.tar.xz
discoin-c6eeab75a1c70b6ad63854e036e5843b7f104d31.zip
Change count type used by `gettxoutsetinfo` (#1415)
changing CAmount (is a int64_t) to arith_uint256 for nTotalAmount in CCoinsStats to prevent overflow
Diffstat (limited to 'src')
-rw-r--r--src/rpc/blockchain.cpp4
-rw-r--r--src/rpc/server.cpp10
-rw-r--r--src/rpc/server.h2
3 files changed, 14 insertions, 2 deletions
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index 6fb45a515..a005cde44 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -814,7 +814,7 @@ struct CCoinsStats
uint64_t nTransactionOutputs;
uint64_t nSerializedSize;
uint256 hashSerialized;
- CAmount nTotalAmount;
+ arith_uint256 nTotalAmount;
CCoinsStats() : nHeight(0), nTransactions(0), nTransactionOutputs(0), nSerializedSize(0), nTotalAmount(0) {}
};
@@ -831,7 +831,7 @@ static bool GetUTXOStats(CCoinsView *view, CCoinsStats &stats)
stats.nHeight = mapBlockIndex.find(stats.hashBlock)->second->nHeight;
}
ss << stats.hashBlock;
- CAmount nTotalAmount = 0;
+ arith_uint256 nTotalAmount = 0;
while (pcursor->Valid()) {
boost::this_thread::interruption_point();
uint256 key;
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 67fc82580..26e7297f3 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -143,6 +143,16 @@ UniValue ValueFromAmount(const CAmount& amount)
strprintf("%s%d.%08d", sign ? "-" : "", quotient, remainder));
}
+UniValue ValueFromAmount(const arith_uint256& amount)
+{
+ bool sign = amount < 0;
+ arith_uint256 n_abs = (sign ? -amount : amount);
+ arith_uint256 quotient = n_abs / COIN;
+ arith_uint256 remainder = n_abs - (quotient * COIN);
+ return UniValue(UniValue::VNUM,
+ strprintf("%s%d.%08d", sign ? "-" : "", (int64_t)quotient.getdouble(), (int64_t)remainder.getdouble()));
+}
+
uint256 ParseHashV(const UniValue& v, string strName)
{
string strHex;
diff --git a/src/rpc/server.h b/src/rpc/server.h
index 52f82866d..2ea9326ac 100644
--- a/src/rpc/server.h
+++ b/src/rpc/server.h
@@ -7,6 +7,7 @@
#define BITCOIN_RPCSERVER_H
#include "amount.h"
+#include "arith_uint256.h"
#include "rpc/protocol.h"
#include "uint256.h"
@@ -193,6 +194,7 @@ extern std::vector<unsigned char> ParseHexO(const UniValue& o, std::string strKe
extern int64_t nWalletUnlockTime;
extern CAmount AmountFromValue(const UniValue& value);
extern UniValue ValueFromAmount(const CAmount& amount);
+extern UniValue ValueFromAmount(const arith_uint256& amount);
extern double GetDifficulty(const CBlockIndex* blockindex = NULL);
extern std::string HelpRequiringPassphrase();
extern std::string HelpExampleCli(const std::string& methodname, const std::string& args);