aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--init.cpp1
-rw-r--r--rpc.cpp40
2 files changed, 31 insertions, 10 deletions
diff --git a/init.cpp b/init.cpp
index cfb5d8e330..e114d80727 100644
--- a/init.cpp
+++ b/init.cpp
@@ -182,6 +182,7 @@ bool AppInit2(int argc, char* argv[])
" -rpcport=<port> \t\t " + _("Listen for JSON-RPC connections on <port>\n") +
" -rpcallowip=<ip> \t\t " + _("Allow JSON-RPC connections from specified IP address\n") +
" -rpcconnect=<ip> \t " + _("Send commands to node running on <ip>\n") +
+ " -keypool=<n> \t " + _("Set key pool size to <n>\n") +
" -nolisten \t " + _("Don't accept connections from outside");
#ifdef USE_SSL
diff --git a/rpc.cpp b/rpc.cpp
index fa9bda773c..7dee74c50d 100644
--- a/rpc.cpp
+++ b/rpc.cpp
@@ -315,15 +315,9 @@ Value getnewaddress(const Array& params, bool fHelp)
}
-Value getaccountaddress(const Array& params, bool fHelp)
+string GetAccountAddress(string strAccount, bool bForceNew=false)
{
- if (fHelp || params.size() != 1)
- throw runtime_error(
- "getaccountaddress <account>\n"
- "Returns the current bitcoin address for receiving payments to this account.");
-
- // Parse the account first so we don't generate a key if there's an error
- string strAccount = AccountFromValue(params[0]);
+ string strAddress;
CRITICAL_BLOCK(cs_mapWallet)
{
@@ -350,7 +344,7 @@ Value getaccountaddress(const Array& params, bool fHelp)
}
// Generate a new key
- if (account.vchPubKey.empty())
+ if (account.vchPubKey.empty() || bForceNew)
{
account.vchPubKey = GetKeyFromKeyPool();
string strAddress = PubKeyToAddress(account.vchPubKey);
@@ -359,11 +353,26 @@ Value getaccountaddress(const Array& params, bool fHelp)
}
walletdb.TxnCommit();
- return PubKeyToAddress(account.vchPubKey);
+ strAddress = PubKeyToAddress(account.vchPubKey);
}
+ return strAddress;
+}
+
+Value getaccountaddress(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "getaccountaddress <account>\n"
+ "Returns the current bitcoin address for receiving payments to this account.");
+
+ // Parse the account first so we don't generate a key if there's an error
+ string strAccount = AccountFromValue(params[0]);
+
+ return GetAccountAddress(strAccount);
}
+
Value setaccount(const Array& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
@@ -376,6 +385,17 @@ Value setaccount(const Array& params, bool fHelp)
if (params.size() > 1)
strAccount = AccountFromValue(params[1]);
+ // Detect when changing the account of an address that is the 'unused current key' of another account:
+ CRITICAL_BLOCK(cs_mapAddressBook)
+ {
+ if (mapAddressBook.count(strAddress))
+ {
+ string strOldAccount = mapAddressBook[strAddress];
+ if (strAddress == GetAccountAddress(strOldAccount))
+ GetAccountAddress(strOldAccount, true);
+ }
+ }
+
SetAddressBookName(strAddress, strAccount);
return Value::null;
}