Skip to content

Commit 2655197

Browse files
committed
rpc: add external_signer option to createwallet
1 parent 2700f09 commit 2655197

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

src/rpc/client.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
183183
{ "createwallet", 4, "avoid_reuse"},
184184
{ "createwallet", 5, "descriptors"},
185185
{ "createwallet", 6, "load_on_startup"},
186+
{ "createwallet", 7, "external_signer"},
186187
{ "loadwallet", 1, "load_on_startup"},
187188
{ "unloadwallet", 1, "load_on_startup"},
188189
{ "getnodeaddresses", 0, "count"},

src/wallet/rpcwallet.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2726,6 +2726,7 @@ static RPCHelpMan createwallet()
27262726
{"avoid_reuse", RPCArg::Type::BOOL, /* default */ "false", "Keep track of coin reuse, and treat dirty and clean coins differently with privacy considerations in mind."},
27272727
{"descriptors", RPCArg::Type::BOOL, /* default */ "false", "Create a native descriptor wallet. The wallet will use descriptors internally to handle address creation"},
27282728
{"load_on_startup", RPCArg::Type::BOOL, /* default */ "null", "Save wallet name to persistent settings and load on startup. True to add wallet to startup list, false to remove, null to leave unchanged."},
2729+
{"external_signer", RPCArg::Type::BOOL, /* default */ "false", "Use an external signer such as a hardware wallet. Requires -signer to be configured. Wallet creation will fail if keys cannot be fetched. Requires disable_private_keys and descriptors set to true."},
27292730
},
27302731
RPCResult{
27312732
RPCResult::Type::OBJ, "", "",
@@ -2770,6 +2771,13 @@ static RPCHelpMan createwallet()
27702771
flags |= WALLET_FLAG_DESCRIPTORS;
27712772
warnings.emplace_back(Untranslated("Wallet is an experimental descriptor wallet"));
27722773
}
2774+
if (!request.params[7].isNull() && request.params[7].get_bool()) {
2775+
#ifdef ENABLE_EXTERNAL_SIGNER
2776+
flags |= WALLET_FLAG_EXTERNAL_SIGNER;
2777+
#else
2778+
throw JSONRPCError(RPC_WALLET_ERROR, "Configure with --enable-external-signer to use this");
2779+
#endif
2780+
}
27732781

27742782
#ifndef USE_BDB
27752783
if (!(flags & WALLET_FLAG_DESCRIPTORS)) {

test/functional/test_framework/test_node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,10 +678,10 @@ def __init__(self, rpc, cli=False, descriptors=False):
678678
def __getattr__(self, name):
679679
return getattr(self.rpc, name)
680680

681-
def createwallet(self, wallet_name, disable_private_keys=None, blank=None, passphrase='', avoid_reuse=None, descriptors=None, load_on_startup=None):
681+
def createwallet(self, wallet_name, disable_private_keys=None, blank=None, passphrase='', avoid_reuse=None, descriptors=None, load_on_startup=None, external_signer=None):
682682
if descriptors is None:
683683
descriptors = self.descriptors
684-
return self.__getattr__('createwallet')(wallet_name, disable_private_keys, blank, passphrase, avoid_reuse, descriptors, load_on_startup)
684+
return self.__getattr__('createwallet')(wallet_name, disable_private_keys, blank, passphrase, avoid_reuse, descriptors, load_on_startup, external_signer)
685685

686686
def importprivkey(self, privkey, label=None, rescan=None):
687687
wallet_info = self.getwalletinfo()

test/functional/wallet_signer.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,15 @@ def run_test(self):
7070
)
7171
self.clear_mock_result(self.nodes[1])
7272

73-
# Create new wallets with private keys disabled:
74-
self.nodes[1].createwallet(wallet_name='hww', disable_private_keys=True, descriptors=True)
73+
# Create new wallets for an external signer.
74+
# disable_private_keys and descriptors must be true:
75+
assert_raises_rpc_error(-4, "Private keys must be disabled when using an external signer", self.nodes[1].createwallet, wallet_name='not_hww', disable_private_keys=False, descriptors=True, external_signer=True)
76+
if self.is_bdb_compiled():
77+
assert_raises_rpc_error(-4, "Descriptor support must be enabled when using an external signer", self.nodes[1].createwallet, wallet_name='not_hww', disable_private_keys=True, descriptors=False, external_signer=True)
78+
else:
79+
assert_raises_rpc_error(-4, "Compiled without bdb support (required for legacy wallets)", self.nodes[1].createwallet, wallet_name='not_hww', disable_private_keys=True, descriptors=False, external_signer=True)
80+
81+
self.nodes[1].createwallet(wallet_name='hww', disable_private_keys=True, descriptors=True, external_signer=True)
7582
hww = self.nodes[1].get_wallet_rpc('hww')
7683

7784
result = hww.enumeratesigners()

0 commit comments

Comments
 (0)