lianad: in DaemonControl::update_deriv_indexes() limit the gap the index can be incremented and return db indexes

This commit is contained in:
pythcoiner 2025-03-17 12:36:57 +01:00
parent 107e81071c
commit e1b90b056f
No known key found for this signature in database
GPG Key ID: C1048AEEDF303B88
6 changed files with 54 additions and 24 deletions

View File

@ -5,7 +5,7 @@ use std::path::Path;
use async_trait::async_trait;
use lianad::bip329::Labels;
use lianad::commands::GetLabelsBip329Result;
use lianad::commands::{GetLabelsBip329Result, UpdateDerivIndexesResult};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};
use serde_json::json;
@ -87,7 +87,7 @@ impl<C: Client + Send + Sync + Debug> Daemon for Lianad<C> {
&self,
receive: Option<u32>,
change: Option<u32>,
) -> Result<(), DaemonError> {
) -> Result<UpdateDerivIndexesResult, DaemonError> {
self.call("updatederivationindexes", Some(vec![receive, change]))
}

View File

@ -1,4 +1,5 @@
use lianad::bip329::Labels;
use lianad::commands::UpdateDerivIndexesResult;
use std::collections::{HashMap, HashSet};
use std::path::Path;
use tokio::sync::Mutex;
@ -102,7 +103,7 @@ impl Daemon for EmbeddedDaemon {
&self,
receive: Option<u32>,
change: Option<u32>,
) -> Result<(), DaemonError> {
) -> Result<UpdateDerivIndexesResult, DaemonError> {
self.command(|daemon| {
daemon
.update_deriv_indexes(receive, change)

View File

@ -15,6 +15,7 @@ use liana::miniscript::bitcoin::{
address, bip32::Fingerprint, psbt::Psbt, secp256k1, Address, Network, OutPoint, Txid,
};
use lianad::bip329::Labels;
use lianad::commands::UpdateDerivIndexesResult;
use lianad::{
commands::{CoinStatus, LabelItem, TransactionInfo},
config::Config,
@ -90,7 +91,7 @@ pub trait Daemon: Debug {
&self,
receive: Option<u32>,
change: Option<u32>,
) -> Result<(), DaemonError>;
) -> Result<UpdateDerivIndexesResult, DaemonError>;
async fn list_coins(
&self,
statuses: &[CoinStatus],

View File

@ -14,7 +14,7 @@ use liana::{
};
use lianad::{
bip329::Labels,
commands::{CoinStatus, GetInfoDescriptors, LCSpendInfo, LabelItem},
commands::{CoinStatus, GetInfoDescriptors, LCSpendInfo, LabelItem, UpdateDerivIndexesResult},
config::Config,
};
use reqwest::{Error, IntoUrl, Method, RequestBuilder, Response};
@ -631,7 +631,7 @@ impl Daemon for BackendWalletClient {
&self,
_receive: Option<u32>,
_change: Option<u32>,
) -> Result<(), DaemonError> {
) -> Result<UpdateDerivIndexesResult, DaemonError> {
Err(DaemonError::NotImplemented)
}

View File

@ -362,32 +362,53 @@ impl DaemonControl {
&self,
receive: Option<u32>,
change: Option<u32>,
) -> Result<(), CommandError> {
) -> Result<UpdateDerivIndexesResult, CommandError> {
let mut db_conn = self.db.connection();
const MAX_INCREMENT_GAP: u32 = 1_000;
let db_receive = db_conn.receive_index().into();
let mut final_receive = db_receive;
let db_change = db_conn.change_index().into();
let mut final_change = db_change;
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);
ChildNumber::from_normal_idx(index)
.map_err(|_| CommandError::InvalidDerivationIndex)?;
if index > db_receive {
let delta = (index - db_receive).min(MAX_INCREMENT_GAP);
let index = db_receive + delta;
final_receive = index;
match ChildNumber::from_normal_idx(index) {
Ok(i) => {
db_conn.set_receive_index(i, &self.secp);
}
Err(_) => return Err(CommandError::InvalidDerivationIndex),
};
}
}
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);
ChildNumber::from_normal_idx(index)
.map_err(|_| CommandError::InvalidDerivationIndex)?;
if index > db_change {
let delta = (index - db_change).min(MAX_INCREMENT_GAP);
let index = db_change + delta;
final_change = index;
match ChildNumber::from_normal_idx(index) {
Ok(i) => {
db_conn.set_change_index(i, &self.secp);
}
Err(_) => return Err(CommandError::InvalidDerivationIndex),
};
}
}
Ok(())
Ok(UpdateDerivIndexesResult {
receive: final_receive,
change: final_change,
})
}
/// list addresses
@ -1215,6 +1236,12 @@ pub struct GetInfoResult {
pub change_index: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateDerivIndexesResult {
pub receive: u32,
pub change: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetAddressResult {
#[serde(deserialize_with = "deser_addr_assume_checked")]

View File

@ -238,8 +238,9 @@ fn update_deriv_indexes(
None => None,
};
control.update_deriv_indexes(receive, change)?;
Ok(serde_json::json!({}))
Ok(serde_json::json!(
control.update_deriv_indexes(receive, change)?
))
}
fn list_confirmed(control: &DaemonControl, params: Params) -> Result<serde_json::Value, Error> {