aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/chainparams.cpp4
-rw-r--r--src/chainparams.h5
-rw-r--r--src/consensus/params.h3
-rw-r--r--src/init.cpp5
-rw-r--r--src/main.cpp6
-rw-r--r--src/pow.cpp9
-rw-r--r--src/rpcmining.cpp25
-rw-r--r--src/rpcrawtransaction.cpp111
-rw-r--r--src/rpcserver.cpp177
-rw-r--r--src/rpcserver.h1
-rw-r--r--src/wallet/db.h3
-rw-r--r--src/wallet/rpcdump.cpp16
-rw-r--r--src/wallet/rpcwallet.cpp226
-rw-r--r--src/wallet/walletdb.h1
14 files changed, 356 insertions, 236 deletions
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index 8633d51b2f..97312b366d 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -105,7 +105,7 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
consensus.nMajorityWindow = 1000;
- consensus.powLimit = ~arith_uint256(0) >> 32;
+ consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
@@ -245,7 +245,7 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
consensus.nMajorityWindow = 1000;
- consensus.powLimit = ~arith_uint256(0) >> 1;
+ consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
pchMessageStart[0] = 0xfa;
pchMessageStart[1] = 0xbf;
pchMessageStart[2] = 0xb5;
diff --git a/src/chainparams.h b/src/chainparams.h
index 03b4be8e17..119a7a81d3 100644
--- a/src/chainparams.h
+++ b/src/chainparams.h
@@ -6,7 +6,6 @@
#ifndef BITCOIN_CHAINPARAMS_H
#define BITCOIN_CHAINPARAMS_H
-#include "arith_uint256.h"
#include "chainparamsbase.h"
#include "checkpoints.h"
#include "consensus/params.h"
@@ -44,7 +43,6 @@ public:
const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; }
const std::vector<unsigned char>& AlertKey() const { return vAlertPubKey; }
int GetDefaultPort() const { return nDefaultPort; }
- const arith_uint256& ProofOfWorkLimit() const { return consensus.powLimit; }
int SubsidyHalvingInterval() const { return consensus.nSubsidyHalvingInterval; }
int EnforceBlockUpgradeMajority() const { return consensus.nMajorityEnforceBlockUpgrade; }
int RejectBlockOutdatedMajority() const { return consensus.nMajorityRejectBlockOutdated; }
@@ -62,9 +60,6 @@ public:
bool AllowMinDifficultyBlocks() const { return consensus.fPowAllowMinDifficultyBlocks; }
/** Make standard checks */
bool RequireStandard() const { return fRequireStandard; }
- int64_t TargetTimespan() const { return consensus.nPowTargetTimespan; }
- int64_t TargetSpacing() const { return consensus.nPowTargetSpacing; }
- int64_t DifficultyAdjustmentInterval() const { return consensus.nPowTargetTimespan / consensus.nPowTargetSpacing; }
/** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */
bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
/** In the future use NetworkIDString() for RPC fields */
diff --git a/src/consensus/params.h b/src/consensus/params.h
index c4cfa48c7e..35d447b712 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -6,7 +6,6 @@
#ifndef BITCOIN_CONSENSUS_CONSENSUS_PARAMS_H
#define BITCOIN_CONSENSUS_CONSENSUS_PARAMS_H
-#include "arith_uint256.h"
#include "uint256.h"
namespace Consensus {
@@ -21,7 +20,7 @@ struct Params {
int nMajorityRejectBlockOutdated;
int nMajorityWindow;
/** Proof of work parameters */
- arith_uint256 powLimit;
+ uint256 powLimit;
bool fPowAllowMinDifficultyBlocks;
int64_t nPowTargetSpacing;
int64_t nPowTargetTimespan;
diff --git a/src/init.cpp b/src/init.cpp
index 0d98b2b92b..4d9c233c8c 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -242,11 +242,6 @@ void OnRPCStopped()
void OnRPCPreCommand(const CRPCCommand& cmd)
{
-#ifdef ENABLE_WALLET
- if (cmd.reqWallet && !pwalletMain)
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
-#endif
-
// Observe safe mode
string strWarning = GetWarnings("rpc");
if (strWarning != "" && !GetBoolArg("-disablesafemode", false) &&
diff --git a/src/main.cpp b/src/main.cpp
index 247c2c786d..f0aa3022cd 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3582,6 +3582,7 @@ void static ProcessGetData(CNode* pfrom)
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived)
{
+ const CChainParams& chainparams = Params();
RandAddSeedPerfmon();
LogPrint("net", "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->id);
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
@@ -3841,7 +3842,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// not a direct successor.
pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), inv.hash);
CNodeState *nodestate = State(pfrom->GetId());
- if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - Params().TargetSpacing() * 20 &&
+ if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - chainparams.GetConsensus().nPowTargetSpacing * 20 &&
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
vToFetch.push_back(inv);
// Mark block as in flight already, even though the actual "getdata" message only goes out
@@ -4504,6 +4505,7 @@ bool ProcessMessages(CNode* pfrom)
bool SendMessages(CNode* pto, bool fSendTrickle)
{
+ const Consensus::Params& consensusParams = Params().GetConsensus();
{
// Don't send anything until we get their version message
if (pto->nVersion == 0)
@@ -4691,7 +4693,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// timeout. We compensate for in-flight blocks to prevent killing off peers due to our own downstream link
// being saturated. We only count validated in-flight blocks so peers can't advertize nonexisting block hashes
// to unreasonably increase our timeout.
- if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0 && state.vBlocksInFlight.front().nTime < nNow - 500000 * Params().TargetSpacing() * (4 + state.vBlocksInFlight.front().nValidatedQueuedBefore)) {
+ if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0 && state.vBlocksInFlight.front().nTime < nNow - 500000 * consensusParams.nPowTargetSpacing * (4 + state.vBlocksInFlight.front().nValidatedQueuedBefore)) {
LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", state.vBlocksInFlight.front().hash.ToString(), pto->id);
pto->fDisconnect = true;
}
diff --git a/src/pow.cpp b/src/pow.cpp
index cf7ac387f2..fc6ed4f3d1 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -13,7 +13,7 @@
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
{
- unsigned int nProofOfWorkLimit = params.powLimit.GetCompact();
+ unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();
// Genesis block
if (pindexLast == NULL)
@@ -61,6 +61,7 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
nActualTimespan = params.nPowTargetTimespan*4;
// Retarget
+ const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
arith_uint256 bnOld;
bnNew.SetCompact(pindexLast->nBits);
@@ -68,8 +69,8 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
- if (bnNew > params.powLimit)
- bnNew = params.powLimit;
+ if (bnNew > bnPowLimit)
+ bnNew = bnPowLimit;
/// debug print
LogPrintf("GetNextWorkRequired RETARGET\n");
@@ -89,7 +90,7 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
// Check range
- if (fNegative || bnTarget == 0 || fOverflow || bnTarget > params.powLimit)
+ if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
return error("CheckProofOfWork(): nBits below minimum work");
// Check proof of work matches claimed amount
diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp
index 1e6531f68a..18f0ec0f81 100644
--- a/src/rpcmining.cpp
+++ b/src/rpcmining.cpp
@@ -45,7 +45,7 @@ Value GetNetworkHashPS(int lookup, int height) {
// If lookup is -1, then use blocks since last difficulty change.
if (lookup <= 0)
- lookup = pb->nHeight % Params().DifficultyAdjustmentInterval() + 1;
+ lookup = pb->nHeight % Params().GetConsensus().DifficultyAdjustmentInterval() + 1;
// If lookup is larger than chain, then set it to chain length.
if (lookup > pb->nHeight)
@@ -629,14 +629,19 @@ Value submitblock(const Array& params, bool fHelp)
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
uint256 hash = block.GetHash();
- BlockMap::iterator mi = mapBlockIndex.find(hash);
- if (mi != mapBlockIndex.end()) {
- CBlockIndex *pindex = mi->second;
- if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
- return "duplicate";
- if (pindex->nStatus & BLOCK_FAILED_MASK)
- return "duplicate-invalid";
- // Otherwise, we might only have the header - process the block before returning
+ bool fBlockPresent = false;
+ {
+ LOCK(cs_main);
+ BlockMap::iterator mi = mapBlockIndex.find(hash);
+ if (mi != mapBlockIndex.end()) {
+ CBlockIndex *pindex = mi->second;
+ if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
+ return "duplicate";
+ if (pindex->nStatus & BLOCK_FAILED_MASK)
+ return "duplicate-invalid";
+ // Otherwise, we might only have the header - process the block before returning
+ fBlockPresent = true;
+ }
}
CValidationState state;
@@ -644,7 +649,7 @@ Value submitblock(const Array& params, bool fHelp)
RegisterValidationInterface(&sc);
bool fAccepted = ProcessNewBlock(state, NULL, &block);
UnregisterValidationInterface(&sc);
- if (mi != mapBlockIndex.end())
+ if (fBlockPresent)
{
if (fAccepted && !sc.found)
return "duplicate-inconclusive";
diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp
index a79b4e3394..c979217a13 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpcrawtransaction.cpp
@@ -193,117 +193,6 @@ Value getrawtransaction(const Array& params, bool fHelp)
return result;
}
-#ifdef ENABLE_WALLET
-Value listunspent(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() > 3)
- throw runtime_error(
- "listunspent ( minconf maxconf [\"address\",...] )\n"
- "\nReturns array of unspent transaction outputs\n"
- "with between minconf and maxconf (inclusive) confirmations.\n"
- "Optionally filter to only include txouts paid to specified addresses.\n"
- "Results are an array of Objects, each of which has:\n"
- "{txid, vout, scriptPubKey, amount, confirmations}\n"
- "\nArguments:\n"
- "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n"
- "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n"
- "3. \"addresses\" (string) A json array of bitcoin addresses to filter\n"
- " [\n"
- " \"address\" (string) bitcoin address\n"
- " ,...\n"
- " ]\n"
- "\nResult\n"
- "[ (array of json object)\n"
- " {\n"
- " \"txid\" : \"txid\", (string) the transaction id \n"
- " \"vout\" : n, (numeric) the vout value\n"
- " \"address\" : \"address\", (string) the bitcoin address\n"
- " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n"
- " \"scriptPubKey\" : \"key\", (string) the script key\n"
- " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n"
- " \"confirmations\" : n (numeric) The number of confirmations\n"
- " }\n"
- " ,...\n"
- "]\n"
-
- "\nExamples\n"
- + HelpExampleCli("listunspent", "")
- + HelpExampleCli("listunspent", "6 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
- + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
- );
-
- RPCTypeCheck(params, boost::assign::list_of(int_type)(int_type)(array_type));
-
- int nMinDepth = 1;
- if (params.size() > 0)
- nMinDepth = params[0].get_int();
-
- int nMaxDepth = 9999999;
- if (params.size() > 1)
- nMaxDepth = params[1].get_int();
-
- set<CBitcoinAddress> setAddress;
- if (params.size() > 2) {
- Array inputs = params[2].get_array();
- BOOST_FOREACH(Value& input, inputs) {
- CBitcoinAddress address(input.get_str());
- if (!address.IsValid())
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+input.get_str());
- if (setAddress.count(address))
- throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+input.get_str());
- setAddress.insert(address);
- }
- }
-
- Array results;
- vector<COutput> vecOutputs;
- assert(pwalletMain != NULL);
- LOCK2(cs_main, pwalletMain->cs_wallet);
- pwalletMain->AvailableCoins(vecOutputs, false);
- BOOST_FOREACH(const COutput& out, vecOutputs) {
- if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
- continue;
-
- if (setAddress.size()) {
- CTxDestination address;
- if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
- continue;
-
- if (!setAddress.count(address))
- continue;
- }
-
- CAmount nValue = out.tx->vout[out.i].nValue;
- const CScript& pk = out.tx->vout[out.i].scriptPubKey;
- Object entry;
- entry.push_back(Pair("txid", out.tx->GetHash().GetHex()));
- entry.push_back(Pair("vout", out.i));
- CTxDestination address;
- if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) {
- entry.push_back(Pair("address", CBitcoinAddress(address).ToString()));
- if (pwalletMain->mapAddressBook.count(address))
- entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name));
- }
- entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end())));
- if (pk.IsPayToScriptHash()) {
- CTxDestination address;
- if (ExtractDestination(pk, address)) {
- const CScriptID& hash = boost::get<const CScriptID&>(address);
- CScript redeemScript;
- if (pwalletMain->GetCScript(hash, redeemScript))
- entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end())));
- }
- }
- entry.push_back(Pair("amount",ValueFromAmount(nValue)));
- entry.push_back(Pair("confirmations",out.nDepth));
- entry.push_back(Pair("spendable", out.fSpendable));
- results.push_back(entry);
- }
-
- return results;
-}
-#endif
-
Value createrawtransaction(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 2)
diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp
index 0fd7769a19..e2df41fe21 100644
--- a/src/rpcserver.cpp
+++ b/src/rpcserver.cpp
@@ -193,11 +193,6 @@ string CRPCTable::help(string strCommand) const
continue;
if ((strCommand != "" || pcmd->category == "hidden") && strMethod != strCommand)
continue;
-#ifdef ENABLE_WALLET
- if (pcmd->reqWallet && !pwalletMain)
- continue;
-#endif
-
try
{
Array params;
@@ -271,114 +266,114 @@ Value stop(const Array& params, bool fHelp)
* Call Table
*/
static const CRPCCommand vRPCCommands[] =
-{ // category name actor (function) okSafeMode reqWallet
- // --------------------- ------------------------ ----------------------- ---------- ---------
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
/* Overall control/query calls */
- { "control", "getinfo", &getinfo, true, false }, /* uses wallet if enabled */
- { "control", "help", &help, true, false },
- { "control", "stop", &stop, true, false },
+ { "control", "getinfo", &getinfo, true }, /* uses wallet if enabled */
+ { "control", "help", &help, true },
+ { "control", "stop", &stop, true },
/* P2P networking */
- { "network", "getnetworkinfo", &getnetworkinfo, true, false },
- { "network", "addnode", &addnode, true, false },
- { "network", "getaddednodeinfo", &getaddednodeinfo, true, false },
- { "network", "getconnectioncount", &getconnectioncount, true, false },
- { "network", "getnettotals", &getnettotals, true, false },
- { "network", "getpeerinfo", &getpeerinfo, true, false },
- { "network", "ping", &ping, true, false },
+ { "network", "getnetworkinfo", &getnetworkinfo, true },
+ { "network", "addnode", &addnode, true },
+ { "network", "getaddednodeinfo", &getaddednodeinfo, true },
+ { "network", "getconnectioncount", &getconnectioncount, true },
+ { "network", "getnettotals", &getnettotals, true },
+ { "network", "getpeerinfo", &getpeerinfo, true },
+ { "network", "ping", &ping, true },
/* Block chain and UTXO */
- { "blockchain", "getblockchaininfo", &getblockchaininfo, true, false },
- { "blockchain", "getbestblockhash", &getbestblockhash, true, false },
- { "blockchain", "getblockcount", &getblockcount, true, false },
- { "blockchain", "getblock", &getblock, true, false },
- { "blockchain", "getblockhash", &getblockhash, true, false },
- { "blockchain", "getchaintips", &getchaintips, true, false },
- { "blockchain", "getdifficulty", &getdifficulty, true, false },
- { "blockchain", "getmempoolinfo", &getmempoolinfo, true, false },
- { "blockchain", "getrawmempool", &getrawmempool, true, false },
- { "blockchain", "gettxout", &gettxout, true, false },
- { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true, false },
- { "blockchain", "verifychain", &verifychain, true, false },
+ { "blockchain", "getblockchaininfo", &getblockchaininfo, true },
+ { "blockchain", "getbestblockhash", &getbestblockhash, true },
+ { "blockchain", "getblockcount", &getblockcount, true },
+ { "blockchain", "getblock", &getblock, true },
+ { "blockchain", "getblockhash", &getblockhash, true },
+ { "blockchain", "getchaintips", &getchaintips, true },
+ { "blockchain", "getdifficulty", &getdifficulty, true },
+ { "blockchain", "getmempoolinfo", &getmempoolinfo, true },
+ { "blockchain", "getrawmempool", &getrawmempool, true },
+ { "blockchain", "gettxout", &gettxout, true },
+ { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true },
+ { "blockchain", "verifychain", &verifychain, true },
/* Mining */
- { "mining", "getblocktemplate", &getblocktemplate, true, false },
- { "mining", "getmininginfo", &getmininginfo, true, false },
- { "mining", "getnetworkhashps", &getnetworkhashps, true, false },
- { "mining", "prioritisetransaction", &prioritisetransaction, true, false },
- { "mining", "submitblock", &submitblock, true, false },
+ { "mining", "getblocktemplate", &getblocktemplate, true },
+ { "mining", "getmininginfo", &getmininginfo, true },
+ { "mining", "getnetworkhashps", &getnetworkhashps, true },
+ { "mining", "prioritisetransaction", &prioritisetransaction, true },
+ { "mining", "submitblock", &submitblock, true },
#ifdef ENABLE_WALLET
/* Coin generation */
- { "generating", "getgenerate", &getgenerate, true, false },
- { "generating", "setgenerate", &setgenerate, true, false },
- { "generating", "generate", &generate, true, false },
+ { "generating", "getgenerate", &getgenerate, true },
+ { "generating", "setgenerate", &setgenerate, true },
+ { "generating", "generate", &generate, true },
#endif
/* Raw transactions */
- { "rawtransactions", "createrawtransaction", &createrawtransaction, true, false },
- { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true, false },
- { "rawtransactions", "decodescript", &decodescript, true, false },
- { "rawtransactions", "getrawtransaction", &getrawtransaction, true, false },
- { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false, false },
- { "rawtransactions", "signrawtransaction", &signrawtransaction, false, false }, /* uses wallet if enabled */
+ { "rawtransactions", "createrawtransaction", &createrawtransaction, true },
+ { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true },
+ { "rawtransactions", "decodescript", &decodescript, true },
+ { "rawtransactions", "getrawtransaction", &getrawtransaction, true },
+ { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
+ { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
/* Utility functions */
- { "util", "createmultisig", &createmultisig, true, false },
- { "util", "validateaddress", &validateaddress, true, false }, /* uses wallet if enabled */
- { "util", "verifymessage", &verifymessage, true, false },
- { "util", "estimatefee", &estimatefee, true, false },
- { "util", "estimatepriority", &estimatepriority, true, false },
+ { "util", "createmultisig", &createmultisig, true },
+ { "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
+ { "util", "verifymessage", &verifymessage, true },
+ { "util", "estimatefee", &estimatefee, true },
+ { "util", "estimatepriority", &estimatepriority, true },
/* Not shown in help */
- { "hidden", "invalidateblock", &invalidateblock, true, false },
- { "hidden", "reconsiderblock", &reconsiderblock, true, false },
- { "hidden", "setmocktime", &setmocktime, true, false },
+ { "hidden", "invalidateblock", &invalidateblock, true },
+ { "hidden", "reconsiderblock", &reconsiderblock, true },
+ { "hidden", "setmocktime", &setmocktime, true },
#ifdef ENABLE_WALLET
- { "hidden", "resendwallettransactions", &resendwallettransactions, true, true },
+ { "hidden", "resendwallettransactions", &resendwallettransactions, true},
#endif
#ifdef ENABLE_WALLET
/* Wallet */
- { "wallet", "addmultisigaddress", &addmultisigaddress, true, true },
- { "wallet", "backupwallet", &backupwallet, true, true },
- { "wallet", "dumpprivkey", &dumpprivkey, true, true },
- { "wallet", "dumpwallet", &dumpwallet, true, true },
- { "wallet", "encryptwallet", &encryptwallet, true, true },
- { "wallet", "getaccountaddress", &getaccountaddress, true, true },
- { "wallet", "getaccount", &getaccount, true, true },
- { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true, true },
- { "wallet", "getbalance", &getbalance, false, true },
- { "wallet", "getnewaddress", &getnewaddress, true, true },
- { "wallet", "getrawchangeaddress", &getrawchangeaddress, true, true },
- { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false, true },
- { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false, true },
- { "wallet", "gettransaction", &gettransaction, false, true },
- { "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false, true },
- { "wallet", "getwalletinfo", &getwalletinfo, false, true },
- { "wallet", "importprivkey", &importprivkey, true, true },
- { "wallet", "importwallet", &importwallet, true, true },
- { "wallet", "importaddress", &importaddress, true, true },
- { "wallet", "keypoolrefill", &keypoolrefill, true, true },
- { "wallet", "listaccounts", &listaccounts, false, true },
- { "wallet", "listaddressgroupings", &listaddressgroupings, false, true },
- { "wallet", "listlockunspent", &listlockunspent, false, true },
- { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false, true },
- { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false, true },
- { "wallet", "listsinceblock", &listsinceblock, false, true },
- { "wallet", "listtransactions", &listtransactions, false, true },
- { "wallet", "listunspent", &listunspent, false, true },
- { "wallet", "lockunspent", &lockunspent, true, true },
- { "wallet", "move", &movecmd, false, true },
- { "wallet", "sendfrom", &sendfrom, false, true },
- { "wallet", "sendmany", &sendmany, false, true },
- { "wallet", "sendtoaddress", &sendtoaddress, false, true },
- { "wallet", "setaccount", &setaccount, true, true },
- { "wallet", "settxfee", &settxfee, true, true },
- { "wallet", "signmessage", &signmessage, true, true },
- { "wallet", "walletlock", &walletlock, true, true },
- { "wallet", "walletpassphrasechange", &walletpassphrasechange, true, true },
- { "wallet", "walletpassphrase", &walletpassphrase, true, true },
+ { "wallet", "addmultisigaddress", &addmultisigaddress, true },
+ { "wallet", "backupwallet", &backupwallet, true },
+ { "wallet", "dumpprivkey", &dumpprivkey, true },
+ { "wallet", "dumpwallet", &dumpwallet, true },
+ { "wallet", "encryptwallet", &encryptwallet, true },
+ { "wallet", "getaccountaddress", &getaccountaddress, true },
+ { "wallet", "getaccount", &getaccount, true },
+ { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
+ { "wallet", "getbalance", &getbalance, false },
+ { "wallet", "getnewaddress", &getnewaddress, true },
+ { "wallet", "getrawchangeaddress", &getrawchangeaddress, true },
+ { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false },
+ { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false },
+ { "wallet", "gettransaction", &gettransaction, false },
+ { "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false },
+ { "wallet", "getwalletinfo", &getwalletinfo, false },
+ { "wallet", "importprivkey", &importprivkey, true },
+ { "wallet", "importwallet", &importwallet, true },
+ { "wallet", "importaddress", &importaddress, true },
+ { "wallet", "keypoolrefill", &keypoolrefill, true },
+ { "wallet", "listaccounts", &listaccounts, false },
+ { "wallet", "listaddressgroupings", &listaddressgroupings, false },
+ { "wallet", "listlockunspent", &listlockunspent, false },
+ { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false },
+ { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false },
+ { "wallet", "listsinceblock", &listsinceblock, false },
+ { "wallet", "listtransactions", &listtransactions, false },
+ { "wallet", "listunspent", &listunspent, false },
+ { "wallet", "lockunspent", &lockunspent, true },
+ { "wallet", "move", &movecmd, false },
+ { "wallet", "sendfrom", &sendfrom, false },
+ { "wallet", "sendmany", &sendmany, false },
+ { "wallet", "sendtoaddress", &sendtoaddress, false },
+ { "wallet", "setaccount", &setaccount, true },
+ { "wallet", "settxfee", &settxfee, true },
+ { "wallet", "signmessage", &signmessage, true },
+ { "wallet", "walletlock", &walletlock, true },
+ { "wallet", "walletpassphrasechange", &walletpassphrasechange, true },
+ { "wallet", "walletpassphrase", &walletpassphrase, true },
#endif // ENABLE_WALLET
};
diff --git a/src/rpcserver.h b/src/rpcserver.h
index e7aaed8bdf..c3200d8c35 100644
--- a/src/rpcserver.h
+++ b/src/rpcserver.h
@@ -98,7 +98,6 @@ public:
std::string name;
rpcfn_type actor;
bool okSafeMode;
- bool reqWallet;
};
/**
diff --git a/src/wallet/db.h b/src/wallet/db.h
index 0c2c139d89..790ae50413 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -25,9 +25,6 @@ class COutPoint;
extern unsigned int nWalletDBUpdated;
-void ThreadFlushWalletDB(const std::string& strWalletFile);
-
-
class CDBEnv
{
private:
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp
index b9c92a06c5..ab951d1d7d 100644
--- a/src/wallet/rpcdump.cpp
+++ b/src/wallet/rpcdump.cpp
@@ -25,6 +25,7 @@ using namespace json_spirit;
using namespace std;
void EnsureWalletIsUnlocked();
+bool EnsureWalletIsAvailable(bool avoidException);
std::string static EncodeDumpTime(int64_t nTime) {
return DateTimeStrFormat("%Y-%m-%dT%H:%M:%SZ", nTime);
@@ -71,6 +72,9 @@ std::string DecodeDumpString(const std::string &str) {
Value importprivkey(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 3)
throw runtime_error(
"importprivkey \"bitcoinprivkey\" ( \"label\" rescan )\n"
@@ -142,6 +146,9 @@ Value importprivkey(const Array& params, bool fHelp)
Value importaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 3)
throw runtime_error(
"importaddress \"address\" ( \"label\" rescan )\n"
@@ -212,6 +219,9 @@ Value importaddress(const Array& params, bool fHelp)
Value importwallet(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"importwallet \"filename\"\n"
@@ -313,6 +323,9 @@ Value importwallet(const Array& params, bool fHelp)
Value dumpprivkey(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"dumpprivkey \"bitcoinaddress\"\n"
@@ -348,6 +361,9 @@ Value dumpprivkey(const Array& params, bool fHelp)
Value dumpwallet(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"dumpwallet \"filename\"\n"
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp
index 29f3eda15d..e03cd5b84e 100644
--- a/src/wallet/rpcwallet.cpp
+++ b/src/wallet/rpcwallet.cpp
@@ -37,6 +37,18 @@ std::string HelpRequiringPassphrase()
: "";
}
+bool EnsureWalletIsAvailable(bool avoidException)
+{
+ if (!pwalletMain)
+ {
+ if (!avoidException)
+ throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
+ else
+ return false;
+ }
+ return true;
+}
+
void EnsureWalletIsUnlocked()
{
if (pwalletMain->IsLocked())
@@ -77,6 +89,9 @@ string AccountFromValue(const Value& value)
Value getnewaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getnewaddress ( \"account\" )\n"
@@ -153,6 +168,9 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
Value getaccountaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccountaddress \"account\"\n"
@@ -182,6 +200,9 @@ Value getaccountaddress(const Array& params, bool fHelp)
Value getrawchangeaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getrawchangeaddress\n"
@@ -214,6 +235,9 @@ Value getrawchangeaddress(const Array& params, bool fHelp)
Value setaccount(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"setaccount \"bitcoinaddress\" \"account\"\n"
@@ -257,6 +281,9 @@ Value setaccount(const Array& params, bool fHelp)
Value getaccount(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccount \"bitcoinaddress\"\n"
@@ -286,6 +313,9 @@ Value getaccount(const Array& params, bool fHelp)
Value getaddressesbyaccount(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaddressesbyaccount \"account\"\n"
@@ -351,6 +381,9 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr
Value sendtoaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error(
"sendtoaddress \"bitcoinaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n"
@@ -404,6 +437,9 @@ Value sendtoaddress(const Array& params, bool fHelp)
Value listaddressgroupings(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp)
throw runtime_error(
"listaddressgroupings\n"
@@ -453,6 +489,9 @@ Value listaddressgroupings(const Array& params, bool fHelp)
Value signmessage(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 2)
throw runtime_error(
"signmessage \"bitcoinaddress\" \"message\"\n"
@@ -506,6 +545,9 @@ Value signmessage(const Array& params, bool fHelp)
Value getreceivedbyaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"getreceivedbyaddress \"bitcoinaddress\" ( minconf )\n"
@@ -561,6 +603,9 @@ Value getreceivedbyaddress(const Array& params, bool fHelp)
Value getreceivedbyaccount(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"getreceivedbyaccount \"account\" ( minconf )\n"
@@ -647,6 +692,9 @@ CAmount GetAccountBalance(const string& strAccount, int nMinDepth, const isminef
Value getbalance(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"getbalance ( \"account\" minconf includeWatchonly )\n"
@@ -719,6 +767,9 @@ Value getbalance(const Array& params, bool fHelp)
Value getunconfirmedbalance(const Array &params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 0)
throw runtime_error(
"getunconfirmedbalance\n"
@@ -732,6 +783,9 @@ Value getunconfirmedbalance(const Array &params, bool fHelp)
Value movecmd(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 3 || params.size() > 5)
throw runtime_error(
"move \"fromaccount\" \"toaccount\" amount ( minconf \"comment\" )\n"
@@ -799,6 +853,9 @@ Value movecmd(const Array& params, bool fHelp)
Value sendfrom(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 3 || params.size() > 6)
throw runtime_error(
"sendfrom \"fromaccount\" \"tobitcoinaddress\" amount ( minconf \"comment\" \"comment-to\" )\n"
@@ -859,6 +916,9 @@ Value sendfrom(const Array& params, bool fHelp)
Value sendmany(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error(
"sendmany \"fromaccount\" {\"address\":amount,...} ( minconf \"comment\" [\"address\",...] )\n"
@@ -965,6 +1025,9 @@ extern CScript _createmultisig_redeemScript(const Array& params);
Value addmultisigaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 2 || params.size() > 3)
{
string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n"
@@ -1143,6 +1206,9 @@ Value ListReceived(const Array& params, bool fByAccounts)
Value listreceivedbyaddress(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"listreceivedbyaddress ( minconf includeempty includeWatchonly)\n"
@@ -1177,6 +1243,9 @@ Value listreceivedbyaddress(const Array& params, bool fHelp)
Value listreceivedbyaccount(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"listreceivedbyaccount ( minconf includeempty includeWatchonly)\n"
@@ -1304,6 +1373,9 @@ void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Ar
Value listtransactions(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 4)
throw runtime_error(
"listtransactions ( \"account\" count from includeWatchonly)\n"
@@ -1415,6 +1487,9 @@ Value listtransactions(const Array& params, bool fHelp)
Value listaccounts(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 2)
throw runtime_error(
"listaccounts ( minconf includeWatchonly)\n"
@@ -1492,6 +1567,9 @@ Value listaccounts(const Array& params, bool fHelp)
Value listsinceblock(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp)
throw runtime_error(
"listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n"
@@ -1580,6 +1658,9 @@ Value listsinceblock(const Array& params, bool fHelp)
Value gettransaction(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"gettransaction \"txid\" ( includeWatchonly )\n"
@@ -1655,6 +1736,9 @@ Value gettransaction(const Array& params, bool fHelp)
Value backupwallet(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"backupwallet \"destination\"\n"
@@ -1678,6 +1762,9 @@ Value backupwallet(const Array& params, bool fHelp)
Value keypoolrefill(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"keypoolrefill ( newsize )\n"
@@ -1719,6 +1806,9 @@ static void LockWallet(CWallet* pWallet)
Value walletpassphrase(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error(
"walletpassphrase \"passphrase\" timeout\n"
@@ -1776,6 +1866,9 @@ Value walletpassphrase(const Array& params, bool fHelp)
Value walletpassphrasechange(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error(
"walletpassphrasechange \"oldpassphrase\" \"newpassphrase\"\n"
@@ -1819,6 +1912,9 @@ Value walletpassphrasechange(const Array& params, bool fHelp)
Value walletlock(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
throw runtime_error(
"walletlock\n"
@@ -1855,6 +1951,9 @@ Value walletlock(const Array& params, bool fHelp)
Value encryptwallet(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (!pwalletMain->IsCrypted() && (fHelp || params.size() != 1))
throw runtime_error(
"encryptwallet \"passphrase\"\n"
@@ -1909,6 +2008,9 @@ Value encryptwallet(const Array& params, bool fHelp)
Value lockunspent(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n"
@@ -1990,6 +2092,9 @@ Value lockunspent(const Array& params, bool fHelp)
Value listlockunspent(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() > 0)
throw runtime_error(
"listlockunspent\n"
@@ -2036,6 +2141,9 @@ Value listlockunspent(const Array& params, bool fHelp)
Value settxfee(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() < 1 || params.size() > 1)
throw runtime_error(
"settxfee amount\n"
@@ -2062,6 +2170,9 @@ Value settxfee(const Array& params, bool fHelp)
Value getwalletinfo(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 0)
throw runtime_error(
"getwalletinfo\n"
@@ -2099,6 +2210,9 @@ Value getwalletinfo(const Array& params, bool fHelp)
Value resendwallettransactions(const Array& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
if (fHelp || params.size() != 0)
throw runtime_error(
"resendwallettransactions\n"
@@ -2118,3 +2232,115 @@ Value resendwallettransactions(const Array& params, bool fHelp)
}
return result;
}
+
+Value listunspent(const Array& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return Value::null;
+
+ if (fHelp || params.size() > 3)
+ throw runtime_error(
+ "listunspent ( minconf maxconf [\"address\",...] )\n"
+ "\nReturns array of unspent transaction outputs\n"
+ "with between minconf and maxconf (inclusive) confirmations.\n"
+ "Optionally filter to only include txouts paid to specified addresses.\n"
+ "Results are an array of Objects, each of which has:\n"
+ "{txid, vout, scriptPubKey, amount, confirmations}\n"
+ "\nArguments:\n"
+ "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n"
+ "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n"
+ "3. \"addresses\" (string) A json array of bitcoin addresses to filter\n"
+ " [\n"
+ " \"address\" (string) bitcoin address\n"
+ " ,...\n"
+ " ]\n"
+ "\nResult\n"
+ "[ (array of json object)\n"
+ " {\n"
+ " \"txid\" : \"txid\", (string) the transaction id \n"
+ " \"vout\" : n, (numeric) the vout value\n"
+ " \"address\" : \"address\", (string) the bitcoin address\n"
+ " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n"
+ " \"scriptPubKey\" : \"key\", (string) the script key\n"
+ " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n"
+ " \"confirmations\" : n (numeric) The number of confirmations\n"
+ " }\n"
+ " ,...\n"
+ "]\n"
+
+ "\nExamples\n"
+ + HelpExampleCli("listunspent", "")
+ + HelpExampleCli("listunspent", "6 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
+ + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
+ );
+
+ RPCTypeCheck(params, boost::assign::list_of(int_type)(int_type)(array_type));
+
+ int nMinDepth = 1;
+ if (params.size() > 0)
+ nMinDepth = params[0].get_int();
+
+ int nMaxDepth = 9999999;
+ if (params.size() > 1)
+ nMaxDepth = params[1].get_int();
+
+ set<CBitcoinAddress> setAddress;
+ if (params.size() > 2) {
+ Array inputs = params[2].get_array();
+ BOOST_FOREACH(Value& input, inputs) {
+ CBitcoinAddress address(input.get_str());
+ if (!address.IsValid())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+input.get_str());
+ if (setAddress.count(address))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+input.get_str());
+ setAddress.insert(address);
+ }
+ }
+
+ Array results;
+ vector<COutput> vecOutputs;
+ assert(pwalletMain != NULL);
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+ pwalletMain->AvailableCoins(vecOutputs, false);
+ BOOST_FOREACH(const COutput& out, vecOutputs) {
+ if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
+ continue;
+
+ if (setAddress.size()) {
+ CTxDestination address;
+ if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
+ continue;
+
+ if (!setAddress.count(address))
+ continue;
+ }
+
+ CAmount nValue = out.tx->vout[out.i].nValue;
+ const CScript& pk = out.tx->vout[out.i].scriptPubKey;
+ Object entry;
+ entry.push_back(Pair("txid", out.tx->GetHash().GetHex()));
+ entry.push_back(Pair("vout", out.i));
+ CTxDestination address;
+ if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) {
+ entry.push_back(Pair("address", CBitcoinAddress(address).ToString()));
+ if (pwalletMain->mapAddressBook.count(address))
+ entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name));
+ }
+ entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end())));
+ if (pk.IsPayToScriptHash()) {
+ CTxDestination address;
+ if (ExtractDestination(pk, address)) {
+ const CScriptID& hash = boost::get<const CScriptID&>(address);
+ CScript redeemScript;
+ if (pwalletMain->GetCScript(hash, redeemScript))
+ entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end())));
+ }
+ }
+ entry.push_back(Pair("amount",ValueFromAmount(nValue)));
+ entry.push_back(Pair("confirmations",out.nDepth));
+ entry.push_back(Pair("spendable", out.fSpendable));
+ results.push_back(entry);
+ }
+
+ return results;
+} \ No newline at end of file
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index a1c38b9d3d..e5f64ffaae 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -138,5 +138,6 @@ private:
};
bool BackupWallet(const CWallet& wallet, const std::string& strDest);
+void ThreadFlushWalletDB(const std::string& strFile);
#endif // BITCOIN_WALLETDB_H