diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -4609,6 +4609,8 @@ // Sign the transaction auto locked_chain = pwallet->chain().lock(); LOCK(pwallet->cs_wallet); + EnsureWalletIsUnlocked(pwallet); + return SignTransaction(pwallet->chain(), mtx, request.params[1], pwallet, false, request.params[2]); } diff --git a/test/functional/rpc_signrawtransaction.py b/test/functional/rpc_signrawtransaction.py --- a/test/functional/rpc_signrawtransaction.py +++ b/test/functional/rpc_signrawtransaction.py @@ -52,6 +52,17 @@ # 2) No script verification error occurred assert 'errors' not in rawTxSigned + def test_with_lock_outputs(self): + """Test correct error reporting when trying to sign a locked output""" + self.nodes[0].encryptwallet("password") + + rawTx = '020000000156b958f78e3f24e0b2f4e4db1255426b0902027cb37e3ddadb52e37c3557dddb0000000000ffffffff01c0a6b929010000001600149a2ee8c77140a053f36018ac8124a6ececc1668a00000000' + + assert_raises_rpc_error(-13, + "Please enter the wallet passphrase with walletpassphrase first", + self.nodes[0].signrawtransactionwithwallet, + rawTx) + def script_verification_error_test(self): """Creates and signs a raw transaction with valid (vin 0), invalid (vin 1) and one missing (vin 2) input script. @@ -236,6 +247,7 @@ self.script_verification_error_test() self.test_sighashes() self.multiwallet_signing_test() + self.test_with_lock_outputs() if __name__ == '__main__':