lianad: add update_deriv_indexes() command

This commit is contained in:
pythcoiner 2025-03-08 12:54:46 +01:00
parent 4c2adec67c
commit 39f71d3de8
No known key found for this signature in database
GPG Key ID: C1048AEEDF303B88
2 changed files with 87 additions and 1 deletions

View File

@ -36,7 +36,11 @@ use std::{
};
use miniscript::{
bitcoin::{self, address, bip32, psbt::Psbt},
bitcoin::{
self, address,
bip32::{self, ChildNumber},
psbt::Psbt,
},
psbt::PsbtExt,
};
use serde::{Deserialize, Serialize};
@ -353,6 +357,39 @@ impl DaemonControl {
GetAddressResult::new(address, index)
}
/// Update derivation indexes
pub fn update_deriv_indexes(
&self,
receive: Option<u32>,
change: Option<u32>,
) -> Result<(), CommandError> {
let mut db_conn = self.db.connection();
if let Some(index) = receive {
let child = match ChildNumber::from_normal_idx(index) {
Ok(i) => i,
Err(_) => return Err(CommandError::InvalidDerivationIndex),
};
let db_receive = db_conn.receive_index();
if child > db_receive {
db_conn.set_receive_index(child, &self.secp);
}
}
if let Some(index) = change {
let child = match ChildNumber::from_normal_idx(index) {
Ok(i) => i,
Err(_) => return Err(CommandError::InvalidDerivationIndex),
};
let db_change = db_conn.change_index();
if child > db_change {
db_conn.set_change_index(child, &self.secp);
}
}
Ok(())
}
/// list addresses
pub fn list_addresses(
&self,

View File

@ -199,6 +199,49 @@ fn list_addresses(
Ok(serde_json::json!(&res))
}
fn update_deriv_indexes(
control: &DaemonControl,
params: Params,
) -> Result<serde_json::Value, Error> {
let receive = params.get(0, "receive");
let change = params.get(1, "change");
if receive.is_none() && change.is_none() {
return Err(Error::invalid_params(
"Missing 'receive' or 'change' parameter",
));
}
let receive = match receive {
Some(i) => {
let res = i.as_i64().ok_or(Error::invalid_params(
"Invalid value for 'receive' param".to_string(),
))?;
let res = res
.try_into()
.map_err(|_| Error::invalid_params("Invalid value for 'receive' param"))?;
Some(res)
}
None => None,
};
let change = match change {
Some(i) => {
let res = i.as_i64().ok_or(Error::invalid_params(
"Invalid value for 'change' param".to_string(),
))?;
let res = res
.try_into()
.map_err(|_| Error::invalid_params("Invalid value for 'change' param"))?;
Some(res)
}
None => None,
};
control.update_deriv_indexes(receive, change)?;
Ok(serde_json::json!({}))
}
fn list_confirmed(control: &DaemonControl, params: Params) -> Result<serde_json::Value, Error> {
let start: u32 = params
.get(0, "start")
@ -417,6 +460,12 @@ pub fn handle_request(control: &mut DaemonControl, req: Request) -> Result<Respo
}
"getinfo" => serde_json::json!(&control.get_info()),
"getnewaddress" => serde_json::json!(&control.get_new_address()),
"updatederivationindexes" => {
let params = req.params.ok_or_else(|| {
Error::invalid_params("Missing 'receive' or 'change' parameters.")
})?;
update_deriv_indexes(control, params)?
}
"listcoins" => {
let params = req.params;
list_coins(control, params)?