lianad: in DaemonControl::update_deriv_indexes() limit the gap the index can be incremented and return db indexes
This commit is contained in:
parent
107e81071c
commit
e1b90b056f
@ -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]))
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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],
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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")]
|
||||
|
||||
@ -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> {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user