|
|
@ -3,6 +3,8 @@ |
|
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
|
|
// Distributed under the MIT/X11 software license, see the accompanying
|
|
|
|
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
// file license.txt or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdint.h> |
|
|
|
|
|
|
|
|
|
|
|
#include "headers.h" |
|
|
|
#include "headers.h" |
|
|
|
#include "db.h" |
|
|
|
#include "db.h" |
|
|
|
#include "net.h" |
|
|
|
#include "net.h" |
|
|
@ -40,7 +42,7 @@ extern map<string, rpcfn_type> mapCallTable; |
|
|
|
|
|
|
|
|
|
|
|
static std::string strRPCUserColonPass; |
|
|
|
static std::string strRPCUserColonPass; |
|
|
|
|
|
|
|
|
|
|
|
static int64 nWalletUnlockTime; |
|
|
|
static int64_t nWalletUnlockTime; |
|
|
|
static CCriticalSection cs_nWalletUnlockTime; |
|
|
|
static CCriticalSection cs_nWalletUnlockTime; |
|
|
|
|
|
|
|
|
|
|
|
extern Value dumpprivkey(const Array& params, bool fHelp); |
|
|
|
extern Value dumpprivkey(const Array& params, bool fHelp); |
|
|
@ -73,18 +75,18 @@ void PrintConsole(const std::string &format, ...) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64 AmountFromValue(const Value& value) |
|
|
|
int64_t AmountFromValue(const Value& value) |
|
|
|
{ |
|
|
|
{ |
|
|
|
double dAmount = value.get_real(); |
|
|
|
double dAmount = value.get_real(); |
|
|
|
if (dAmount <= 0.0 || dAmount > 21000000.0) |
|
|
|
if (dAmount <= 0.0 || dAmount > 21000000.0) |
|
|
|
throw JSONRPCError(-3, "Invalid amount"); |
|
|
|
throw JSONRPCError(-3, "Invalid amount"); |
|
|
|
int64 nAmount = roundint64(dAmount * COIN); |
|
|
|
int64_t nAmount = roundint64(dAmount * COIN); |
|
|
|
if (!MoneyRange(nAmount)) |
|
|
|
if (!MoneyRange(nAmount)) |
|
|
|
throw JSONRPCError(-3, "Invalid amount"); |
|
|
|
throw JSONRPCError(-3, "Invalid amount"); |
|
|
|
return nAmount; |
|
|
|
return nAmount; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Value ValueFromAmount(int64 amount) |
|
|
|
Value ValueFromAmount(int64_t amount) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return (double)amount / (double)COIN; |
|
|
|
return (double)amount / (double)COIN; |
|
|
|
} |
|
|
|
} |
|
|
@ -499,7 +501,7 @@ Value settxfee(const Array& params, bool fHelp) |
|
|
|
"<amount> is a real and is rounded to the nearest 0.00000001"); |
|
|
|
"<amount> is a real and is rounded to the nearest 0.00000001"); |
|
|
|
|
|
|
|
|
|
|
|
// Amount
|
|
|
|
// Amount
|
|
|
|
int64 nAmount = 0; |
|
|
|
int64_t nAmount = 0; |
|
|
|
if (params[0].get_real() != 0.0) |
|
|
|
if (params[0].get_real() != 0.0) |
|
|
|
nAmount = AmountFromValue(params[0]); // rejects 0.0 amounts
|
|
|
|
nAmount = AmountFromValue(params[0]); // rejects 0.0 amounts
|
|
|
|
|
|
|
|
|
|
|
@ -524,7 +526,7 @@ Value sendtoaddress(const Array& params, bool fHelp) |
|
|
|
throw JSONRPCError(-5, "Invalid bitcoin address"); |
|
|
|
throw JSONRPCError(-5, "Invalid bitcoin address"); |
|
|
|
|
|
|
|
|
|
|
|
// Amount
|
|
|
|
// Amount
|
|
|
|
int64 nAmount = AmountFromValue(params[1]); |
|
|
|
int64_t nAmount = AmountFromValue(params[1]); |
|
|
|
|
|
|
|
|
|
|
|
// Wallet comments
|
|
|
|
// Wallet comments
|
|
|
|
CWalletTx wtx; |
|
|
|
CWalletTx wtx; |
|
|
@ -632,7 +634,7 @@ Value getreceivedbyaddress(const Array& params, bool fHelp) |
|
|
|
nMinDepth = params[1].get_int(); |
|
|
|
nMinDepth = params[1].get_int(); |
|
|
|
|
|
|
|
|
|
|
|
// Tally
|
|
|
|
// Tally
|
|
|
|
int64 nAmount = 0; |
|
|
|
int64_t nAmount = 0; |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
@ -679,7 +681,7 @@ Value getreceivedbyaccount(const Array& params, bool fHelp) |
|
|
|
GetAccountAddresses(strAccount, setAddress); |
|
|
|
GetAccountAddresses(strAccount, setAddress); |
|
|
|
|
|
|
|
|
|
|
|
// Tally
|
|
|
|
// Tally
|
|
|
|
int64 nAmount = 0; |
|
|
|
int64_t nAmount = 0; |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
@ -699,9 +701,9 @@ Value getreceivedbyaccount(const Array& params, bool fHelp) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int64 GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinDepth) |
|
|
|
int64_t GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinDepth) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64 nBalance = 0; |
|
|
|
int64_t nBalance = 0; |
|
|
|
|
|
|
|
|
|
|
|
// Tally wallet transactions
|
|
|
|
// Tally wallet transactions
|
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
@ -710,7 +712,7 @@ int64 GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinD |
|
|
|
if (!wtx.IsFinal()) |
|
|
|
if (!wtx.IsFinal()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
int64 nGenerated, nReceived, nSent, nFee; |
|
|
|
int64_t nGenerated, nReceived, nSent, nFee; |
|
|
|
wtx.GetAccountAmounts(strAccount, nGenerated, nReceived, nSent, nFee); |
|
|
|
wtx.GetAccountAmounts(strAccount, nGenerated, nReceived, nSent, nFee); |
|
|
|
|
|
|
|
|
|
|
|
if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
if (nReceived != 0 && wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
@ -724,7 +726,7 @@ int64 GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMinD |
|
|
|
return nBalance; |
|
|
|
return nBalance; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int64 GetAccountBalance(const string& strAccount, int nMinDepth) |
|
|
|
int64_t GetAccountBalance(const string& strAccount, int nMinDepth) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
return GetAccountBalance(walletdb, strAccount, nMinDepth); |
|
|
|
return GetAccountBalance(walletdb, strAccount, nMinDepth); |
|
|
@ -750,23 +752,23 @@ Value getbalance(const Array& params, bool fHelp) |
|
|
|
// Calculate total balance a different way from GetBalance()
|
|
|
|
// Calculate total balance a different way from GetBalance()
|
|
|
|
// (GetBalance() sums up all unspent TxOuts)
|
|
|
|
// (GetBalance() sums up all unspent TxOuts)
|
|
|
|
// getbalance and getbalance '*' should always return the same number.
|
|
|
|
// getbalance and getbalance '*' should always return the same number.
|
|
|
|
int64 nBalance = 0; |
|
|
|
int64_t nBalance = 0; |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
if (!wtx.IsFinal()) |
|
|
|
if (!wtx.IsFinal()) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
int64 allGeneratedImmature, allGeneratedMature, allFee; |
|
|
|
int64_t allGeneratedImmature, allGeneratedMature, allFee; |
|
|
|
allGeneratedImmature = allGeneratedMature = allFee = 0; |
|
|
|
allGeneratedImmature = allGeneratedMature = allFee = 0; |
|
|
|
string strSentAccount; |
|
|
|
string strSentAccount; |
|
|
|
list<pair<CBitcoinAddress, int64> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64> > listSent; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listSent; |
|
|
|
wtx.GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount); |
|
|
|
wtx.GetAmounts(allGeneratedImmature, allGeneratedMature, listReceived, listSent, allFee, strSentAccount); |
|
|
|
if (wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
if (wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listReceived) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64_t)& r, listReceived) |
|
|
|
nBalance += r.second; |
|
|
|
nBalance += r.second; |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64)& r, listSent) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress,int64_t)& r, listSent) |
|
|
|
nBalance -= r.second; |
|
|
|
nBalance -= r.second; |
|
|
|
nBalance -= allFee; |
|
|
|
nBalance -= allFee; |
|
|
|
nBalance += allGeneratedMature; |
|
|
|
nBalance += allGeneratedMature; |
|
|
@ -776,7 +778,7 @@ Value getbalance(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
string strAccount = AccountFromValue(params[0]); |
|
|
|
string strAccount = AccountFromValue(params[0]); |
|
|
|
|
|
|
|
|
|
|
|
int64 nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
int64_t nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
|
|
|
|
|
|
|
|
return ValueFromAmount(nBalance); |
|
|
|
return ValueFromAmount(nBalance); |
|
|
|
} |
|
|
|
} |
|
|
@ -791,7 +793,7 @@ Value movecmd(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
string strFrom = AccountFromValue(params[0]); |
|
|
|
string strFrom = AccountFromValue(params[0]); |
|
|
|
string strTo = AccountFromValue(params[1]); |
|
|
|
string strTo = AccountFromValue(params[1]); |
|
|
|
int64 nAmount = AmountFromValue(params[2]); |
|
|
|
int64_t nAmount = AmountFromValue(params[2]); |
|
|
|
if (params.size() > 3) |
|
|
|
if (params.size() > 3) |
|
|
|
// unused parameter, used to be nMinDepth, keep type-checking it though
|
|
|
|
// unused parameter, used to be nMinDepth, keep type-checking it though
|
|
|
|
(void)params[3].get_int(); |
|
|
|
(void)params[3].get_int(); |
|
|
@ -802,7 +804,7 @@ Value movecmd(const Array& params, bool fHelp) |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
CWalletDB walletdb(pwalletMain->strWalletFile); |
|
|
|
walletdb.TxnBegin(); |
|
|
|
walletdb.TxnBegin(); |
|
|
|
|
|
|
|
|
|
|
|
int64 nNow = GetAdjustedTime(); |
|
|
|
int64_t nNow = GetAdjustedTime(); |
|
|
|
|
|
|
|
|
|
|
|
// Debit
|
|
|
|
// Debit
|
|
|
|
CAccountingEntry debit; |
|
|
|
CAccountingEntry debit; |
|
|
@ -844,7 +846,7 @@ Value sendfrom(const Array& params, bool fHelp) |
|
|
|
CBitcoinAddress address(params[1].get_str()); |
|
|
|
CBitcoinAddress address(params[1].get_str()); |
|
|
|
if (!address.IsValid()) |
|
|
|
if (!address.IsValid()) |
|
|
|
throw JSONRPCError(-5, "Invalid bitcoin address"); |
|
|
|
throw JSONRPCError(-5, "Invalid bitcoin address"); |
|
|
|
int64 nAmount = AmountFromValue(params[2]); |
|
|
|
int64_t nAmount = AmountFromValue(params[2]); |
|
|
|
int nMinDepth = 1; |
|
|
|
int nMinDepth = 1; |
|
|
|
if (params.size() > 3) |
|
|
|
if (params.size() > 3) |
|
|
|
nMinDepth = params[3].get_int(); |
|
|
|
nMinDepth = params[3].get_int(); |
|
|
@ -860,7 +862,7 @@ Value sendfrom(const Array& params, bool fHelp) |
|
|
|
throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); |
|
|
|
throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); |
|
|
|
|
|
|
|
|
|
|
|
// Check funds
|
|
|
|
// Check funds
|
|
|
|
int64 nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
int64_t nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
if (nAmount > nBalance) |
|
|
|
if (nAmount > nBalance) |
|
|
|
throw JSONRPCError(-6, "Account has insufficient funds"); |
|
|
|
throw JSONRPCError(-6, "Account has insufficient funds"); |
|
|
|
|
|
|
|
|
|
|
@ -897,9 +899,9 @@ Value sendmany(const Array& params, bool fHelp) |
|
|
|
wtx.mapValue["comment"] = params[3].get_str(); |
|
|
|
wtx.mapValue["comment"] = params[3].get_str(); |
|
|
|
|
|
|
|
|
|
|
|
set<CBitcoinAddress> setAddress; |
|
|
|
set<CBitcoinAddress> setAddress; |
|
|
|
vector<pair<CScript, int64> > vecSend; |
|
|
|
vector<pair<CScript, int64_t> > vecSend; |
|
|
|
|
|
|
|
|
|
|
|
int64 totalAmount = 0; |
|
|
|
int64_t totalAmount = 0; |
|
|
|
BOOST_FOREACH(const Pair& s, sendTo) |
|
|
|
BOOST_FOREACH(const Pair& s, sendTo) |
|
|
|
{ |
|
|
|
{ |
|
|
|
CBitcoinAddress address(s.name_); |
|
|
|
CBitcoinAddress address(s.name_); |
|
|
@ -912,7 +914,7 @@ Value sendmany(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
CScript scriptPubKey; |
|
|
|
CScript scriptPubKey; |
|
|
|
scriptPubKey.SetBitcoinAddress(address); |
|
|
|
scriptPubKey.SetBitcoinAddress(address); |
|
|
|
int64 nAmount = AmountFromValue(s.value_); |
|
|
|
int64_t nAmount = AmountFromValue(s.value_); |
|
|
|
totalAmount += nAmount; |
|
|
|
totalAmount += nAmount; |
|
|
|
|
|
|
|
|
|
|
|
vecSend.push_back(make_pair(scriptPubKey, nAmount)); |
|
|
|
vecSend.push_back(make_pair(scriptPubKey, nAmount)); |
|
|
@ -922,13 +924,13 @@ Value sendmany(const Array& params, bool fHelp) |
|
|
|
throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); |
|
|
|
throw JSONRPCError(-13, "Error: Please enter the wallet passphrase with walletpassphrase first."); |
|
|
|
|
|
|
|
|
|
|
|
// Check funds
|
|
|
|
// Check funds
|
|
|
|
int64 nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
int64_t nBalance = GetAccountBalance(strAccount, nMinDepth); |
|
|
|
if (totalAmount > nBalance) |
|
|
|
if (totalAmount > nBalance) |
|
|
|
throw JSONRPCError(-6, "Account has insufficient funds"); |
|
|
|
throw JSONRPCError(-6, "Account has insufficient funds"); |
|
|
|
|
|
|
|
|
|
|
|
// Send
|
|
|
|
// Send
|
|
|
|
CReserveKey keyChange(pwalletMain); |
|
|
|
CReserveKey keyChange(pwalletMain); |
|
|
|
int64 nFeeRequired = 0; |
|
|
|
int64_t nFeeRequired = 0; |
|
|
|
bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired); |
|
|
|
bool fCreated = pwalletMain->CreateTransaction(vecSend, wtx, keyChange, nFeeRequired); |
|
|
|
if (!fCreated) |
|
|
|
if (!fCreated) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1007,7 +1009,7 @@ Value addmultisigaddress(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
struct tallyitem |
|
|
|
struct tallyitem |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64 nAmount; |
|
|
|
int64_t nAmount; |
|
|
|
int nConf; |
|
|
|
int nConf; |
|
|
|
tallyitem() |
|
|
|
tallyitem() |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1063,7 +1065,7 @@ Value ListReceived(const Array& params, bool fByAccounts) |
|
|
|
if (it == mapTally.end() && !fIncludeEmpty) |
|
|
|
if (it == mapTally.end() && !fIncludeEmpty) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
int64 nAmount = 0; |
|
|
|
int64_t nAmount = 0; |
|
|
|
int nConf = std::numeric_limits<int>::max(); |
|
|
|
int nConf = std::numeric_limits<int>::max(); |
|
|
|
if (it != mapTally.end()) |
|
|
|
if (it != mapTally.end()) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1092,7 +1094,7 @@ Value ListReceived(const Array& params, bool fByAccounts) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (map<string, tallyitem>::iterator it = mapAccountTally.begin(); it != mapAccountTally.end(); ++it) |
|
|
|
for (map<string, tallyitem>::iterator it = mapAccountTally.begin(); it != mapAccountTally.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64 nAmount = (*it).second.nAmount; |
|
|
|
int64_t nAmount = (*it).second.nAmount; |
|
|
|
int nConf = (*it).second.nConf; |
|
|
|
int nConf = (*it).second.nConf; |
|
|
|
Object obj; |
|
|
|
Object obj; |
|
|
|
obj.push_back(Pair("account", (*it).first)); |
|
|
|
obj.push_back(Pair("account", (*it).first)); |
|
|
@ -1138,10 +1140,10 @@ Value listreceivedbyaccount(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret) |
|
|
|
void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64 nGeneratedImmature, nGeneratedMature, nFee; |
|
|
|
int64_t nGeneratedImmature, nGeneratedMature, nFee; |
|
|
|
string strSentAccount; |
|
|
|
string strSentAccount; |
|
|
|
list<pair<CBitcoinAddress, int64> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64> > listSent; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listSent; |
|
|
|
wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount); |
|
|
|
wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount); |
|
|
|
|
|
|
|
|
|
|
|
bool fAllAccounts = (strAccount == string("*")); |
|
|
|
bool fAllAccounts = (strAccount == string("*")); |
|
|
@ -1169,7 +1171,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe |
|
|
|
// Sent
|
|
|
|
// Sent
|
|
|
|
if ((!listSent.empty() || nFee != 0) && (fAllAccounts || strAccount == strSentAccount)) |
|
|
|
if ((!listSent.empty() || nFee != 0) && (fAllAccounts || strAccount == strSentAccount)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& s, listSent) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Object entry; |
|
|
|
Object entry; |
|
|
|
entry.push_back(Pair("account", strSentAccount)); |
|
|
|
entry.push_back(Pair("account", strSentAccount)); |
|
|
@ -1185,7 +1187,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe |
|
|
|
|
|
|
|
|
|
|
|
// Received
|
|
|
|
// Received
|
|
|
|
if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
if (listReceived.size() > 0 && wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& r, listReceived) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string account; |
|
|
|
string account; |
|
|
|
if (pwalletMain->mapAddressBook.count(r.first)) |
|
|
|
if (pwalletMain->mapAddressBook.count(r.first)) |
|
|
@ -1243,7 +1245,7 @@ Value listtransactions(const Array& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
// Firs: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap:
|
|
|
|
// Firs: get all CWalletTx and CAccountingEntry into a sorted-by-time multimap:
|
|
|
|
typedef pair<CWalletTx*, CAccountingEntry*> TxPair; |
|
|
|
typedef pair<CWalletTx*, CAccountingEntry*> TxPair; |
|
|
|
typedef multimap<int64, TxPair > TxItems; |
|
|
|
typedef multimap<int64_t, TxPair > TxItems; |
|
|
|
TxItems txByTime; |
|
|
|
TxItems txByTime; |
|
|
|
|
|
|
|
|
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
@ -1297,7 +1299,7 @@ Value listaccounts(const Array& params, bool fHelp) |
|
|
|
if (params.size() > 0) |
|
|
|
if (params.size() > 0) |
|
|
|
nMinDepth = params[0].get_int(); |
|
|
|
nMinDepth = params[0].get_int(); |
|
|
|
|
|
|
|
|
|
|
|
map<string, int64> mapAccountBalances; |
|
|
|
map<string, int64_t> mapAccountBalances; |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& entry, pwalletMain->mapAddressBook) { |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, string)& entry, pwalletMain->mapAddressBook) { |
|
|
|
if (pwalletMain->HaveKey(entry.first)) // This address belongs to me
|
|
|
|
if (pwalletMain->HaveKey(entry.first)) // This address belongs to me
|
|
|
|
mapAccountBalances[entry.second] = 0; |
|
|
|
mapAccountBalances[entry.second] = 0; |
|
|
@ -1306,18 +1308,18 @@ Value listaccounts(const Array& params, bool fHelp) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it) |
|
|
|
{ |
|
|
|
{ |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
const CWalletTx& wtx = (*it).second; |
|
|
|
int64 nGeneratedImmature, nGeneratedMature, nFee; |
|
|
|
int64_t nGeneratedImmature, nGeneratedMature, nFee; |
|
|
|
string strSentAccount; |
|
|
|
string strSentAccount; |
|
|
|
list<pair<CBitcoinAddress, int64> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listReceived; |
|
|
|
list<pair<CBitcoinAddress, int64> > listSent; |
|
|
|
list<pair<CBitcoinAddress, int64_t> > listSent; |
|
|
|
wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount); |
|
|
|
wtx.GetAmounts(nGeneratedImmature, nGeneratedMature, listReceived, listSent, nFee, strSentAccount); |
|
|
|
mapAccountBalances[strSentAccount] -= nFee; |
|
|
|
mapAccountBalances[strSentAccount] -= nFee; |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& s, listSent) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& s, listSent) |
|
|
|
mapAccountBalances[strSentAccount] -= s.second; |
|
|
|
mapAccountBalances[strSentAccount] -= s.second; |
|
|
|
if (wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
if (wtx.GetDepthInMainChain() >= nMinDepth) |
|
|
|
{ |
|
|
|
{ |
|
|
|
mapAccountBalances[""] += nGeneratedMature; |
|
|
|
mapAccountBalances[""] += nGeneratedMature; |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64)& r, listReceived) |
|
|
|
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, int64_t)& r, listReceived) |
|
|
|
if (pwalletMain->mapAddressBook.count(r.first)) |
|
|
|
if (pwalletMain->mapAddressBook.count(r.first)) |
|
|
|
mapAccountBalances[pwalletMain->mapAddressBook[r.first]] += r.second; |
|
|
|
mapAccountBalances[pwalletMain->mapAddressBook[r.first]] += r.second; |
|
|
|
else |
|
|
|
else |
|
|
@ -1331,7 +1333,7 @@ Value listaccounts(const Array& params, bool fHelp) |
|
|
|
mapAccountBalances[entry.strAccount] += entry.nCreditDebit; |
|
|
|
mapAccountBalances[entry.strAccount] += entry.nCreditDebit; |
|
|
|
|
|
|
|
|
|
|
|
Object ret; |
|
|
|
Object ret; |
|
|
|
BOOST_FOREACH(const PAIRTYPE(string, int64)& accountBalance, mapAccountBalances) { |
|
|
|
BOOST_FOREACH(const PAIRTYPE(string, int64_t)& accountBalance, mapAccountBalances) { |
|
|
|
ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second))); |
|
|
|
ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second))); |
|
|
|
} |
|
|
|
} |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
@ -1417,10 +1419,10 @@ Value gettransaction(const Array& params, bool fHelp) |
|
|
|
throw JSONRPCError(-5, "Invalid or non-wallet transaction id"); |
|
|
|
throw JSONRPCError(-5, "Invalid or non-wallet transaction id"); |
|
|
|
const CWalletTx& wtx = pwalletMain->mapWallet[hash]; |
|
|
|
const CWalletTx& wtx = pwalletMain->mapWallet[hash]; |
|
|
|
|
|
|
|
|
|
|
|
int64 nCredit = wtx.GetCredit(); |
|
|
|
int64_t nCredit = wtx.GetCredit(); |
|
|
|
int64 nDebit = wtx.GetDebit(); |
|
|
|
int64_t nDebit = wtx.GetDebit(); |
|
|
|
int64 nNet = nCredit - nDebit; |
|
|
|
int64_t nNet = nCredit - nDebit; |
|
|
|
int64 nFee = (wtx.IsFromMe() ? wtx.GetValueOut() - nDebit : 0); |
|
|
|
int64_t nFee = (wtx.IsFromMe() ? wtx.GetValueOut() - nDebit : 0); |
|
|
|
|
|
|
|
|
|
|
|
entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee))); |
|
|
|
entry.push_back(Pair("amount", ValueFromAmount(nNet - nFee))); |
|
|
|
if (wtx.IsFromMe()) |
|
|
|
if (wtx.IsFromMe()) |
|
|
@ -1480,7 +1482,7 @@ void ThreadTopUpKeyPool(void* parg) |
|
|
|
|
|
|
|
|
|
|
|
void ThreadCleanWalletPassphrase(void* parg) |
|
|
|
void ThreadCleanWalletPassphrase(void* parg) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64 nMyWakeTime = GetTime() + *((int*)parg); |
|
|
|
int64_t nMyWakeTime = GetTime() + *((int*)parg); |
|
|
|
|
|
|
|
|
|
|
|
if (nWalletUnlockTime == 0) |
|
|
|
if (nWalletUnlockTime == 0) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -1727,7 +1729,7 @@ Value getwork(const Array& params, bool fHelp) |
|
|
|
// Update block
|
|
|
|
// Update block
|
|
|
|
static unsigned int nTransactionsUpdatedLast; |
|
|
|
static unsigned int nTransactionsUpdatedLast; |
|
|
|
static CBlockIndex* pindexPrev; |
|
|
|
static CBlockIndex* pindexPrev; |
|
|
|
static int64 nStart; |
|
|
|
static int64_t nStart; |
|
|
|
static CBlock* pblock; |
|
|
|
static CBlock* pblock; |
|
|
|
if (pindexPrev != pindexBest || |
|
|
|
if (pindexPrev != pindexBest || |
|
|
|
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60)) |
|
|
|
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60)) |
|
|
@ -1831,7 +1833,7 @@ Value getmemorypool(const Array& params, bool fHelp) |
|
|
|
// Update block
|
|
|
|
// Update block
|
|
|
|
static unsigned int nTransactionsUpdatedLast; |
|
|
|
static unsigned int nTransactionsUpdatedLast; |
|
|
|
static CBlockIndex* pindexPrev; |
|
|
|
static CBlockIndex* pindexPrev; |
|
|
|
static int64 nStart; |
|
|
|
static int64_t nStart; |
|
|
|
static CBlock* pblock; |
|
|
|
static CBlock* pblock; |
|
|
|
if (pindexPrev != pindexBest || |
|
|
|
if (pindexPrev != pindexBest || |
|
|
|
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5)) |
|
|
|
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5)) |
|
|
|