aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/wallet_rpc_server.cpp
diff options
context:
space:
mode:
authorjeffro256 <jeffro256@tutanota.com>2023-06-22 09:15:12 +0200
committerjeffro256 <jeffro256@tutanota.com>2023-08-10 10:13:07 -0500
commit78348bcddd18fa7a25541595576bef1df4fc4022 (patch)
tree2013fb8202a2e5eb886c4a7a93c49bc7a177de09 /src/wallet/wallet_rpc_server.cpp
parentMerge pull request #8917 (diff)
downloadmonero-78348bcddd18fa7a25541595576bef1df4fc4022.tar.xz
wallet-rpc: restore from multisig seed
Diffstat (limited to '')
-rw-r--r--src/wallet/wallet_rpc_server.cpp33
1 files changed, 30 insertions, 3 deletions
diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp
index 32628d65b..078535928 100644
--- a/src/wallet/wallet_rpc_server.cpp
+++ b/src/wallet/wallet_rpc_server.cpp
@@ -3806,7 +3806,7 @@ namespace tools
std::string old_language;
// check the given seed
- {
+ if (!req.enable_multisig_experimental) {
if (!crypto::ElectrumWords::words_to_bytes(req.seed, recovery_key, old_language))
{
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
@@ -3829,6 +3829,13 @@ namespace tools
// process seed_offset if given
{
+ if (req.enable_multisig_experimental && !req.seed_offset.empty())
+ {
+ er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
+ er.message = "Multisig seeds are not compatible with seed offsets";
+ return false;
+ }
+
if (!req.seed_offset.empty())
{
recovery_key = cryptonote::decrypt_key(recovery_key, req.seed_offset);
@@ -3892,7 +3899,27 @@ namespace tools
crypto::secret_key recovery_val;
try
{
- recovery_val = wal->generate(wallet_file, std::move(rc.second).password(), recovery_key, true, false, false);
+ if (req.enable_multisig_experimental)
+ {
+ // Parse multisig seed into raw multisig data
+ epee::wipeable_string multisig_data;
+ multisig_data.resize(req.seed.size() / 2);
+ if (!epee::from_hex::to_buffer(epee::to_mut_byte_span(multisig_data), req.seed))
+ {
+ er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
+ er.message = "Multisig seed not represented as hexadecimal string";
+ return false;
+ }
+
+ // Generate multisig wallet
+ wal->generate(wallet_file, std::move(rc.second).password(), multisig_data, false);
+ wal->enable_multisig(true);
+ }
+ else
+ {
+ // Generate normal wallet
+ recovery_val = wal->generate(wallet_file, std::move(rc.second).password(), recovery_key, true, false, false);
+ }
MINFO("Wallet has been restored.\n");
}
catch (const std::exception &e)
@@ -3903,7 +3930,7 @@ namespace tools
// // Convert the secret key back to seed
epee::wipeable_string electrum_words;
- if (!crypto::ElectrumWords::bytes_to_words(recovery_val, electrum_words, mnemonic_language))
+ if (!req.enable_multisig_experimental && !crypto::ElectrumWords::bytes_to_words(recovery_val, electrum_words, mnemonic_language))
{
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
er.message = "Failed to encode seed";