@ -315,12 +315,11 @@ Value getnewaddress(const Array& params, bool fHelp)
}
}
// requires cs_main, cs_mapWallet locks
string GetAccountAddress ( string strAccount , bool bForceNew = false )
string GetAccountAddress ( string strAccount , bool bForceNew = false )
{
{
string strAddress ;
string strAddress ;
CRITICAL_BLOCK ( cs_mapWallet )
{
CWalletDB walletdb ;
CWalletDB walletdb ;
walletdb . TxnBegin ( ) ;
walletdb . TxnBegin ( ) ;
@ -354,7 +353,7 @@ string GetAccountAddress(string strAccount, bool bForceNew=false)
walletdb . TxnCommit ( ) ;
walletdb . TxnCommit ( ) ;
strAddress = PubKeyToAddress ( account . vchPubKey ) ;
strAddress = PubKeyToAddress ( account . vchPubKey ) ;
}
return strAddress ;
return strAddress ;
}
}
@ -368,7 +367,15 @@ Value getaccountaddress(const Array& params, bool fHelp)
// Parse the account first so we don't generate a key if there's an error
// Parse the account first so we don't generate a key if there's an error
string strAccount = AccountFromValue ( params [ 0 ] ) ;
string strAccount = AccountFromValue ( params [ 0 ] ) ;
return GetAccountAddress ( strAccount ) ;
Value ret ;
CRITICAL_BLOCK ( cs_main )
CRITICAL_BLOCK ( cs_mapWallet )
{
ret = GetAccountAddress ( strAccount ) ;
}
return ret ;
}
}
@ -392,6 +399,8 @@ Value setaccount(const Array& params, bool fHelp)
strAccount = AccountFromValue ( params [ 1 ] ) ;
strAccount = AccountFromValue ( params [ 1 ] ) ;
// Detect when changing the account of an address that is the 'unused current key' of another account:
// Detect when changing the account of an address that is the 'unused current key' of another account:
CRITICAL_BLOCK ( cs_main )
CRITICAL_BLOCK ( cs_mapWallet )
CRITICAL_BLOCK ( cs_mapAddressBook )
CRITICAL_BLOCK ( cs_mapAddressBook )
{
{
if ( mapAddressBook . count ( strAddress ) )
if ( mapAddressBook . count ( strAddress ) )
@ -475,9 +484,13 @@ Value sendtoaddress(const Array& params, bool fHelp)
if ( params . size ( ) > 3 & & params [ 3 ] . type ( ) ! = null_type & & ! params [ 3 ] . get_str ( ) . empty ( ) )
if ( params . size ( ) > 3 & & params [ 3 ] . type ( ) ! = null_type & & ! params [ 3 ] . get_str ( ) . empty ( ) )
wtx . mapValue [ " to " ] = params [ 3 ] . get_str ( ) ;
wtx . mapValue [ " to " ] = params [ 3 ] . get_str ( ) ;
CRITICAL_BLOCK ( cs_main )
{
string strError = SendMoneyToBitcoinAddress ( strAddress , nAmount , wtx ) ;
string strError = SendMoneyToBitcoinAddress ( strAddress , nAmount , wtx ) ;
if ( strError ! = " " )
if ( strError ! = " " )
throw JSONRPCError ( - 4 , strError ) ;
throw JSONRPCError ( - 4 , strError ) ;
}
return wtx . GetHash ( ) . GetHex ( ) ;
return wtx . GetHash ( ) . GetHex ( ) ;
}
}
@ -752,6 +765,7 @@ Value sendfrom(const Array& params, bool fHelp)
if ( params . size ( ) > 5 & & params [ 5 ] . type ( ) ! = null_type & & ! params [ 5 ] . get_str ( ) . empty ( ) )
if ( params . size ( ) > 5 & & params [ 5 ] . type ( ) ! = null_type & & ! params [ 5 ] . get_str ( ) . empty ( ) )
wtx . mapValue [ " to " ] = params [ 5 ] . get_str ( ) ;
wtx . mapValue [ " to " ] = params [ 5 ] . get_str ( ) ;
CRITICAL_BLOCK ( cs_main )
CRITICAL_BLOCK ( cs_mapWallet )
CRITICAL_BLOCK ( cs_mapWallet )
{
{
// Check funds
// Check funds
@ -808,6 +822,7 @@ Value sendmany(const Array& params, bool fHelp)
vecSend . push_back ( make_pair ( scriptPubKey , nAmount ) ) ;
vecSend . push_back ( make_pair ( scriptPubKey , nAmount ) ) ;
}
}
CRITICAL_BLOCK ( cs_main )
CRITICAL_BLOCK ( cs_mapWallet )
CRITICAL_BLOCK ( cs_mapWallet )
{
{
// Check funds
// Check funds