From f73782a9032a462a71569e9424db9bf9eeababf3 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sun, 19 Mar 2023 10:23:45 -0700 Subject: doc: fix/improve warning helps in {create,load,unload,restore}wallet - clarify that there can be multiple warning messages - specify the correct wallet action - describe the use of newlines as delimiters --- src/wallet/rpc/backup.cpp | 2 +- src/wallet/rpc/wallet.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp index 9b6b3d629c..9154632520 100644 --- a/src/wallet/rpc/backup.cpp +++ b/src/wallet/rpc/backup.cpp @@ -1903,7 +1903,7 @@ RPCHelpMan restorewallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if restored successfully."}, - {RPCResult::Type::STR, "warning", "Warning message if wallet was not loaded cleanly."}, + {RPCResult::Type::STR, "warning", "Warning messages, if any, related to restoring the wallet. Multiple messages will be delimited by newlines."}, } }, RPCExamples{ diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index 16595267b4..20cd697646 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -207,7 +207,7 @@ static RPCHelpMan loadwallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if loaded successfully."}, - {RPCResult::Type::STR, "warning", "Warning message if wallet was not loaded cleanly."}, + {RPCResult::Type::STR, "warning", "Warning messages, if any, related to loading the wallet. Multiple messages will be delimited by newlines."}, } }, RPCExamples{ @@ -335,7 +335,7 @@ static RPCHelpMan createwallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if created successfully. If the wallet was created using a full path, the wallet_name will be the full path."}, - {RPCResult::Type::STR, "warning", "Warning message if wallet was not loaded cleanly."}, + {RPCResult::Type::STR, "warning", "Warning messages, if any, related to creating the wallet. Multiple messages will be delimited by newlines."}, } }, RPCExamples{ @@ -422,7 +422,7 @@ static RPCHelpMan unloadwallet() {"load_on_startup", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Save wallet name to persistent settings and load on startup. True to add wallet to startup list, false to remove, null to leave unchanged."}, }, RPCResult{RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::STR, "warning", "Warning message if wallet was not unloaded cleanly."}, + {RPCResult::Type::STR, "warning", "Warning messages, if any, related to unloading the wallet. Multiple messages will be delimited by newlines."}, }}, RPCExamples{ HelpExampleCli("unloadwallet", "wallet_name") -- cgit v1.2.3 From 079d8cdda8eeebe199fb6592fca2630c37662731 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sun, 19 Mar 2023 10:16:09 -0700 Subject: rpc: extract wallet "warnings" fields to a util helper --- src/rpc/output_script.cpp | 2 +- src/rpc/util.cpp | 6 ++++++ src/rpc/util.h | 8 ++++++++ src/wallet/rpc/addresses.cpp | 2 +- src/wallet/rpc/backup.cpp | 4 ++-- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/rpc/output_script.cpp b/src/rpc/output_script.cpp index bb04f58424..990ec3ab0c 100644 --- a/src/rpc/output_script.cpp +++ b/src/rpc/output_script.cpp @@ -162,7 +162,7 @@ static RPCHelpMan createmultisig() // Only warns if the user has explicitly chosen an address type we cannot generate warnings.push_back("Unable to make chosen address type, please ensure no uncompressed public keys are present."); } - if (!warnings.empty()) result.pushKV("warnings", warnings); + PushWarnings(warnings, result); return result; }, diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index ee9e3544a4..f01944cd0b 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -1174,3 +1174,9 @@ UniValue GetServicesNames(ServiceFlags services) return servicesNames; } + +void PushWarnings(const UniValue& warnings, UniValue& obj) +{ + if (warnings.empty()) return; + obj.pushKV("warnings", warnings); +} diff --git a/src/rpc/util.h b/src/rpc/util.h index e3783c8f76..15c73068b9 100644 --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -381,4 +381,12 @@ private: const RPCExamples m_examples; }; +/** + * Push warning messages to an RPC "warnings" field as a JSON array of strings. + * + * @param[in] warnings Warning messages to push. + * @param[out] obj UniValue object to push the warnings array object to. + */ +void PushWarnings(const UniValue& warnings, UniValue& obj); + #endif // BITCOIN_RPC_UTIL_H diff --git a/src/wallet/rpc/addresses.cpp b/src/wallet/rpc/addresses.cpp index da63d45d11..4c27b08373 100644 --- a/src/wallet/rpc/addresses.cpp +++ b/src/wallet/rpc/addresses.cpp @@ -300,7 +300,7 @@ RPCHelpMan addmultisigaddress() // Only warns if the user has explicitly chosen an address type we cannot generate warnings.push_back("Unable to make chosen address type, please ensure no uncompressed public keys are present."); } - if (!warnings.empty()) result.pushKV("warnings", warnings); + PushWarnings(warnings, result); return result; }, diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp index 9154632520..026acf939b 100644 --- a/src/wallet/rpc/backup.cpp +++ b/src/wallet/rpc/backup.cpp @@ -1225,7 +1225,7 @@ static UniValue ProcessImport(CWallet& wallet, const UniValue& data, const int64 result.pushKV("error", JSONRPCError(RPC_MISC_ERROR, "Missing required fields")); } - if (warnings.size()) result.pushKV("warnings", warnings); + PushWarnings(warnings, result); return result; } @@ -1579,7 +1579,7 @@ static UniValue ProcessDescriptorImport(CWallet& wallet, const UniValue& data, c result.pushKV("success", UniValue(false)); result.pushKV("error", e); } - if (warnings.size()) result.pushKV("warnings", warnings); + PushWarnings(warnings, result); return result; } -- cgit v1.2.3 From 4a1e479ca612056761e6247dd5b715dcd6824413 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sun, 19 Mar 2023 10:19:06 -0700 Subject: rpc: add "warnings" field to RPCs {create,load,unload,restore}wallet This new "warnings" field is a JSON array of strings intended to replace the "warning" string field in these four RPCs, to better handle returning multiple warning messages and for consistency with other wallet RPCs. --- src/rpc/util.cpp | 17 +++++++++++++++++ src/rpc/util.h | 1 + src/wallet/rpc/backup.cpp | 5 +++++ src/wallet/rpc/wallet.cpp | 16 ++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp index f01944cd0b..f95ac4cb4b 100644 --- a/src/rpc/util.cpp +++ b/src/rpc/util.cpp @@ -1175,8 +1175,25 @@ UniValue GetServicesNames(ServiceFlags services) return servicesNames; } +/** Convert a vector of bilingual strings to a UniValue::VARR containing their original untranslated values. */ +[[nodiscard]] static UniValue BilingualStringsToUniValue(const std::vector& bilingual_strings) +{ + CHECK_NONFATAL(!bilingual_strings.empty()); + UniValue result{UniValue::VARR}; + for (const auto& s : bilingual_strings) { + result.push_back(s.original); + } + return result; +} + void PushWarnings(const UniValue& warnings, UniValue& obj) { if (warnings.empty()) return; obj.pushKV("warnings", warnings); } + +void PushWarnings(const std::vector& warnings, UniValue& obj) +{ + if (warnings.empty()) return; + obj.pushKV("warnings", BilingualStringsToUniValue(warnings)); +} diff --git a/src/rpc/util.h b/src/rpc/util.h index 15c73068b9..bb5c30a2f4 100644 --- a/src/rpc/util.h +++ b/src/rpc/util.h @@ -388,5 +388,6 @@ private: * @param[out] obj UniValue object to push the warnings array object to. */ void PushWarnings(const UniValue& warnings, UniValue& obj); +void PushWarnings(const std::vector& warnings, UniValue& obj); #endif // BITCOIN_RPC_UTIL_H diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp index 026acf939b..76a736d14d 100644 --- a/src/wallet/rpc/backup.cpp +++ b/src/wallet/rpc/backup.cpp @@ -1904,6 +1904,10 @@ RPCHelpMan restorewallet() { {RPCResult::Type::STR, "name", "The wallet name if restored successfully."}, {RPCResult::Type::STR, "warning", "Warning messages, if any, related to restoring the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to restoring the wallet.", + { + {RPCResult::Type::STR, "", ""}, + }}, } }, RPCExamples{ @@ -1934,6 +1938,7 @@ RPCHelpMan restorewallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + PushWarnings(warnings, obj); return obj; diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index 20cd697646..a28ddfb01b 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -208,6 +208,10 @@ static RPCHelpMan loadwallet() { {RPCResult::Type::STR, "name", "The wallet name if loaded successfully."}, {RPCResult::Type::STR, "warning", "Warning messages, if any, related to loading the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to loading the wallet.", + { + {RPCResult::Type::STR, "", ""}, + }}, } }, RPCExamples{ @@ -241,6 +245,7 @@ static RPCHelpMan loadwallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + PushWarnings(warnings, obj); return obj; }, @@ -336,6 +341,10 @@ static RPCHelpMan createwallet() { {RPCResult::Type::STR, "name", "The wallet name if created successfully. If the wallet was created using a full path, the wallet_name will be the full path."}, {RPCResult::Type::STR, "warning", "Warning messages, if any, related to creating the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to creating the wallet.", + { + {RPCResult::Type::STR, "", ""}, + }}, } }, RPCExamples{ @@ -406,6 +415,7 @@ static RPCHelpMan createwallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + PushWarnings(warnings, obj); return obj; }, @@ -423,6 +433,10 @@ static RPCHelpMan unloadwallet() }, RPCResult{RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "warning", "Warning messages, if any, related to unloading the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to unloading the wallet.", + { + {RPCResult::Type::STR, "", ""}, + }}, }}, RPCExamples{ HelpExampleCli("unloadwallet", "wallet_name") @@ -465,6 +479,8 @@ static RPCHelpMan unloadwallet() UniValue result(UniValue::VOBJ); result.pushKV("warning", Join(warnings, Untranslated("\n")).original); + PushWarnings(warnings, result); + return result; }, }; -- cgit v1.2.3 From 2f4a926e95e0379397859c3ba1b5711be5f09925 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sun, 19 Mar 2023 10:30:51 -0700 Subject: test: add test coverage for "warnings" field in createwallet and clarify the "warning" field behavior. --- test/functional/wallet_createwallet.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/test/functional/wallet_createwallet.py b/test/functional/wallet_createwallet.py index 22c491441b..6e94798174 100755 --- a/test/functional/wallet_createwallet.py +++ b/test/functional/wallet_createwallet.py @@ -15,6 +15,10 @@ from test_framework.util import ( ) from test_framework.wallet_util import bytes_to_wif, generate_wif_key +EMPTY_PASSPHRASE_MSG = "Empty string given as passphrase, wallet will not be encrypted." +LEGACY_WALLET_MSG = "Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future." + + class CreateWalletTest(BitcoinTestFramework): def add_options(self, parser): self.add_wallet_options(parser) @@ -159,7 +163,9 @@ class CreateWalletTest(BitcoinTestFramework): assert_equal(walletinfo['keypoolsize_hd_internal'], keys) # Allow empty passphrase, but there should be a warning resp = self.nodes[0].createwallet(wallet_name='w7', disable_private_keys=False, blank=False, passphrase='') - assert 'Empty string given as passphrase, wallet will not be encrypted.' in resp['warning'] + assert_equal(resp["warning"], EMPTY_PASSPHRASE_MSG if self.options.descriptors else f"{EMPTY_PASSPHRASE_MSG}\n{LEGACY_WALLET_MSG}") + assert_equal(resp["warnings"], [EMPTY_PASSPHRASE_MSG] if self.options.descriptors else [EMPTY_PASSPHRASE_MSG, LEGACY_WALLET_MSG]) + w7 = node.get_wallet_rpc('w7') assert_raises_rpc_error(-15, 'Error: running with an unencrypted wallet, but walletpassphrase was called.', w7.walletpassphrase, '', 60) @@ -174,8 +180,19 @@ class CreateWalletTest(BitcoinTestFramework): if self.is_bdb_compiled(): self.log.info("Test legacy wallet deprecation") - res = self.nodes[0].createwallet(wallet_name="legacy_w0", descriptors=False, passphrase=None) - assert_equal(res["warning"], "Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.") + result = self.nodes[0].createwallet(wallet_name="legacy_w0", descriptors=False, passphrase=None) + assert_equal(result, { + "name": "legacy_w0", + "warning": LEGACY_WALLET_MSG, + "warnings": [LEGACY_WALLET_MSG], + }) + result = self.nodes[0].createwallet(wallet_name="legacy_w1", descriptors=False, passphrase="") + assert_equal(result, { + "name": "legacy_w1", + "warning": f"{EMPTY_PASSPHRASE_MSG}\n{LEGACY_WALLET_MSG}", + "warnings": [EMPTY_PASSPHRASE_MSG, LEGACY_WALLET_MSG], + }) + if __name__ == '__main__': CreateWalletTest().main() -- cgit v1.2.3 From 645d7f75ac1b40e4ea88119b3711f89943d35d6c Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Sun, 19 Mar 2023 19:26:14 -0700 Subject: rpc: deprecate "warning" field in {create,load,unload,restore}wallet This string field has been replaced in these four RPCs by a "warnings" field returning a JSON array of strings. --- src/wallet/rpc/backup.cpp | 6 ++++-- src/wallet/rpc/wallet.cpp | 22 +++++++++++++--------- test/functional/wallet_backwards_compatibility.py | 7 ++++++- test/functional/wallet_createwallet.py | 1 + 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp index 76a736d14d..fb175fa253 100644 --- a/src/wallet/rpc/backup.cpp +++ b/src/wallet/rpc/backup.cpp @@ -1903,7 +1903,7 @@ RPCHelpMan restorewallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if restored successfully."}, - {RPCResult::Type::STR, "warning", "Warning messages, if any, related to restoring the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::STR, "warning", /*optional=*/true, "Warning messages, if any, related to restoring the wallet. Multiple messages will be delimited by newlines. (DEPRECATED, returned only if config option -deprecatedrpc=walletwarningfield is passed.)"}, {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to restoring the wallet.", { {RPCResult::Type::STR, "", ""}, @@ -1937,7 +1937,9 @@ RPCHelpMan restorewallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); - obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + if (wallet->chain().rpcEnableDeprecated("walletwarningfield")) { + obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + } PushWarnings(warnings, obj); return obj; diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index a28ddfb01b..d4aff4dfd6 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -207,7 +207,7 @@ static RPCHelpMan loadwallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if loaded successfully."}, - {RPCResult::Type::STR, "warning", "Warning messages, if any, related to loading the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::STR, "warning", /*optional=*/true, "Warning messages, if any, related to loading the wallet. Multiple messages will be delimited by newlines. (DEPRECATED, returned only if config option -deprecatedrpc=walletwarningfield is passed.)"}, {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to loading the wallet.", { {RPCResult::Type::STR, "", ""}, @@ -244,7 +244,9 @@ static RPCHelpMan loadwallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); - obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + if (wallet->chain().rpcEnableDeprecated("walletwarningfield")) { + obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + } PushWarnings(warnings, obj); return obj; @@ -340,7 +342,7 @@ static RPCHelpMan createwallet() RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name if created successfully. If the wallet was created using a full path, the wallet_name will be the full path."}, - {RPCResult::Type::STR, "warning", "Warning messages, if any, related to creating the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::STR, "warning", /*optional=*/true, "Warning messages, if any, related to creating the wallet. Multiple messages will be delimited by newlines. (DEPRECATED, returned only if config option -deprecatedrpc=walletwarningfield is passed.)"}, {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to creating the wallet.", { {RPCResult::Type::STR, "", ""}, @@ -414,7 +416,9 @@ static RPCHelpMan createwallet() UniValue obj(UniValue::VOBJ); obj.pushKV("name", wallet->GetName()); - obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + if (wallet->chain().rpcEnableDeprecated("walletwarningfield")) { + obj.pushKV("warning", Join(warnings, Untranslated("\n")).original); + } PushWarnings(warnings, obj); return obj; @@ -432,7 +436,7 @@ static RPCHelpMan unloadwallet() {"load_on_startup", RPCArg::Type::BOOL, RPCArg::Optional::OMITTED, "Save wallet name to persistent settings and load on startup. True to add wallet to startup list, false to remove, null to leave unchanged."}, }, RPCResult{RPCResult::Type::OBJ, "", "", { - {RPCResult::Type::STR, "warning", "Warning messages, if any, related to unloading the wallet. Multiple messages will be delimited by newlines."}, + {RPCResult::Type::STR, "warning", /*optional=*/true, "Warning messages, if any, related to unloading the wallet. Multiple messages will be delimited by newlines. (DEPRECATED, returned only if config option -deprecatedrpc=walletwarningfield is passed.)"}, {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to unloading the wallet.", { {RPCResult::Type::STR, "", ""}, @@ -474,13 +478,13 @@ static RPCHelpMan unloadwallet() throw JSONRPCError(RPC_MISC_ERROR, "Requested wallet already unloaded"); } } - - UnloadWallet(std::move(wallet)); - UniValue result(UniValue::VOBJ); - result.pushKV("warning", Join(warnings, Untranslated("\n")).original); + if (wallet->chain().rpcEnableDeprecated("walletwarningfield")) { + result.pushKV("warning", Join(warnings, Untranslated("\n")).original); + } PushWarnings(warnings, result); + UnloadWallet(std::move(wallet)); return result; }, }; diff --git a/test/functional/wallet_backwards_compatibility.py b/test/functional/wallet_backwards_compatibility.py index 76aac3e486..a6401a76c1 100755 --- a/test/functional/wallet_backwards_compatibility.py +++ b/test/functional/wallet_backwards_compatibility.py @@ -265,7 +265,12 @@ class BackwardsCompatibilityTest(BitcoinTestFramework): ) load_res = node_master.loadwallet("u1_v16") # Make sure this wallet opens without warnings. See https://github.com/bitcoin/bitcoin/pull/19054 - assert_equal(load_res['warning'], '') + if int(node_master.getnetworkinfo()["version"]) >= 249900: + # loadwallet#warnings (added in v25) -- only present if there is a warning + assert "warnings" not in load_res + else: + # loadwallet#warning (deprecated in v25) -- always present, but empty string if no warning + assert_equal(load_res["warning"], '') wallet = node_master.get_wallet_rpc("u1_v16") info = wallet.getaddressinfo(v16_addr) descriptor = f"wpkh([{info['hdmasterfingerprint']}{hdkeypath[1:]}]{v16_pubkey})" diff --git a/test/functional/wallet_createwallet.py b/test/functional/wallet_createwallet.py index 6e94798174..15c0c07b0c 100755 --- a/test/functional/wallet_createwallet.py +++ b/test/functional/wallet_createwallet.py @@ -25,6 +25,7 @@ class CreateWalletTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 1 + self.extra_args = [["-deprecatedrpc=walletwarningfield"]] def skip_test_if_missing_module(self): self.skip_if_no_wallet() -- cgit v1.2.3 From 9ea8b3739a863b0ad87593639476b3cd712ff0dc Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Wed, 29 Mar 2023 14:24:14 -0700 Subject: test: createwallet "warning" field deprecation test --- test/functional/wallet_createwallet.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/functional/wallet_createwallet.py b/test/functional/wallet_createwallet.py index 15c0c07b0c..6258eb49d4 100755 --- a/test/functional/wallet_createwallet.py +++ b/test/functional/wallet_createwallet.py @@ -194,6 +194,11 @@ class CreateWalletTest(BitcoinTestFramework): "warnings": [EMPTY_PASSPHRASE_MSG, LEGACY_WALLET_MSG], }) + self.log.info('Test "warning" field deprecation, i.e. not returned without -deprecatedrpc=walletwarningfield') + self.restart_node(0, extra_args=[]) + result = self.nodes[0].createwallet(wallet_name="w7_again", disable_private_keys=False, blank=False, passphrase="") + assert "warning" not in result + if __name__ == '__main__': CreateWalletTest().main() -- cgit v1.2.3 From 01df011ca2bf46ee4c988b03a130eea6df692325 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Wed, 22 Mar 2023 15:28:55 -0700 Subject: doc: release note for wallet RPCs "warning" field deprecation --- doc/release-notes-27279.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 doc/release-notes-27279.md diff --git a/doc/release-notes-27279.md b/doc/release-notes-27279.md new file mode 100644 index 0000000000..b664aee755 --- /dev/null +++ b/doc/release-notes-27279.md @@ -0,0 +1,10 @@ +Wallet +------ + +- In the createwallet, loadwallet, unloadwallet, and restorewallet RPCs, the + "warning" string field is deprecated in favor of a "warnings" field that + returns a JSON array of strings to better handle multiple warning messages and + for consistency with other wallet RPCs. The "warning" field will be fully + removed from these RPCs in v26. It can be temporarily re-enabled during the + deprecation period by launching bitcoind with the configuration option + `-deprecatedrpc=walletwarningfield`. (#27279) -- cgit v1.2.3 From 19d888ce407f44d90785c456a1a3e2a6870e9245 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Wed, 29 Mar 2023 09:31:14 -0700 Subject: rpc: move WALLET_FLAG_CAVEATS to the compilation unit of its caller and add the walletutil.h include header for WALLET_FLAG_AVOID_REUSE that was already missing before this change. WALLET_FLAG_CAVEATS is only used in one RPC, so no need to encumber wallet.h and wallet.cpp with it, along with all of the files that include wallet.h during their compilation. Also apply clang-format per: git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v --- src/wallet/rpc/wallet.cpp | 9 +++++++++ src/wallet/wallet.cpp | 7 ------- src/wallet/wallet.h | 2 -- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index d4aff4dfd6..ea3507bc75 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -20,6 +21,14 @@ namespace wallet { + +static const std::map WALLET_FLAG_CAVEATS{ + {WALLET_FLAG_AVOID_REUSE, + "You need to rescan the blockchain in order to correctly mark used " + "destinations in the past. Until this is done, some destinations may " + "be considered unused, even if the opposite is the case."}, +}; + /** Checks if a CKey is in the given CWallet compressed or otherwise*/ bool HaveKey(const SigningProvider& wallet, const CKey& key) { diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index ef8fb29e64..2b8aeacb2e 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -51,13 +51,6 @@ using interfaces::FoundBlock; namespace wallet { -const std::map WALLET_FLAG_CAVEATS{ - {WALLET_FLAG_AVOID_REUSE, - "You need to rescan the blockchain in order to correctly mark used " - "destinations in the past. Until this is done, some destinations may " - "be considered unused, even if the opposite is the case." - }, -}; bool AddWalletSetting(interfaces::Chain& chain, const std::string& wallet_name) { diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h index e8c18dbb67..346b63fd86 100644 --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -145,8 +145,6 @@ static const std::map WALLET_FLAG_MAP{ {"external_signer", WALLET_FLAG_EXTERNAL_SIGNER} }; -extern const std::map WALLET_FLAG_CAVEATS; - /** A wrapper to reserve an address from a wallet * * ReserveDestination is used to reserve an address. -- cgit v1.2.3 From 7ccdd741fe1544c13b2a9b7baa5c5727e84d6e55 Mon Sep 17 00:00:00 2001 From: Jon Atack Date: Wed, 29 Mar 2023 17:51:44 -0700 Subject: test: fix importmulti/importdescriptors assertion as these RPCs have a "warnings" field, not a "warning" one. --- test/functional/wallet_createwallet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/wallet_createwallet.py b/test/functional/wallet_createwallet.py index 6258eb49d4..58cc6befbd 100755 --- a/test/functional/wallet_createwallet.py +++ b/test/functional/wallet_createwallet.py @@ -60,7 +60,7 @@ class CreateWalletTest(BitcoinTestFramework): else: result = w1.importmulti([{'scriptPubKey': {'address': key_to_p2wpkh(eckey.get_pubkey().get_bytes())}, 'timestamp': 'now', 'keys': [privkey]}]) assert not result[0]['success'] - assert 'warning' not in result[0] + assert 'warnings' not in result[0] assert_equal(result[0]['error']['code'], -4) assert_equal(result[0]['error']['message'], 'Cannot import private keys to a wallet with private keys disabled') -- cgit v1.2.3