Skip to content

Commit

Permalink
implement listadresses
Browse files Browse the repository at this point in the history
  • Loading branch information
pythcoiner committed Sep 9, 2023
1 parent 6d9b754 commit d4f0569
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 0 deletions.
62 changes: 62 additions & 0 deletions src/commands/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ use miniscript::{
};
use serde::{Deserialize, Serialize};

use bitcoin::bip32;

// We would never create a transaction with an output worth less than this.
// That's 1$ at 20_000$ per BTC.
const DUST_OUTPUT_SATS: u64 = 5_000;
Expand Down Expand Up @@ -289,6 +291,48 @@ impl DaemonControl {
GetAddressResult::new(address)
}

/// list addresses
pub fn list_addresses(&self, start_index: u32, count: u32) -> GetAddressesResult {
let mut db_conn = self.db.connection();
let receive_index: u32 = db_conn.receive_index().into();
let change_index: u32 = db_conn.receive_index().into();
let max_index = receive_index.max(change_index);

let index = if count != 0 {
start_index + count - 1
} else {
max_index
};

let addresses: Vec<AddressInfo> = (start_index..=index)
.map(|index| {
let child = bip32::ChildNumber::from_normal_idx(index)
.expect("Failed to convert index to ChildNumber");

let receive = self
.config
.main_descriptor
.receive_descriptor()
.derive(child, &self.secp)
.address(self.config.bitcoin_config.network);

let change = self
.config
.main_descriptor
.change_descriptor()
.derive(child, &self.secp)
.address(self.config.bitcoin_config.network);

AddressInfo {
index,
receive,
change,
}
})
.collect();
GetAddressesResult::new(addresses)
}

/// Get a list of all known coins.
pub fn list_coins(&self) -> ListCoinsResult {
let mut db_conn = self.db.connection();
Expand Down Expand Up @@ -853,6 +897,24 @@ impl GetAddressResult {
}
}

#[derive(Debug, Clone, Serialize)]
pub struct AddressInfo {

This comment has been minimized.

Copy link
@pythcoiner

pythcoiner Sep 9, 2023

Author Collaborator

not sure about the wording of 'AdressInfo'

index: u32,
receive: bitcoin::Address,
change: bitcoin::Address,
}

#[derive(Debug, Clone, Serialize)]
pub struct GetAddressesResult {
addresses: Vec<AddressInfo>,
}

impl GetAddressesResult {
pub fn new(addresses: Vec<AddressInfo>) -> Self {
GetAddressesResult { addresses }
}
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct LCSpendInfo {
pub txid: bitcoin::Txid,
Expand Down
28 changes: 28 additions & 0 deletions src/jsonrpc/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,26 @@ fn broadcast_spend(control: &DaemonControl, params: Params) -> Result<serde_json
Ok(serde_json::json!({}))
}

fn list_addresses(control: &DaemonControl, params: Params) -> Result<serde_json::Value, Error> {
let start_index: u32 = params
.get(0, "start_index")
.ok_or_else(|| Error::invalid_params("Missing 'start_index' parameter."))?
.as_i64()
.and_then(|i| i.try_into().ok())
.ok_or_else(|| Error::invalid_params("Invalid 'start_index' parameter."))?;

let count: u32 = params
.get(1, "count")
.ok_or_else(|| Error::invalid_params("Missing 'count' parameter."))?
.as_i64()
.and_then(|i| i.try_into().ok())
.ok_or_else(|| Error::invalid_params("Invalid 'count' parameter."))?;

Ok(serde_json::json!(
&control.list_addresses(start_index, count)
))
}

fn list_confirmed(control: &DaemonControl, params: Params) -> Result<serde_json::Value, Error> {
let start: u32 = params
.get(0, "start")
Expand Down Expand Up @@ -258,6 +278,14 @@ pub fn handle_request(control: &DaemonControl, req: Request) -> Result<Response,
}
"getinfo" => serde_json::json!(&control.get_info()),
"getnewaddress" => serde_json::json!(&control.get_new_address()),
"listaddresses" => {
let params = req.params.ok_or_else(|| {
Error::invalid_params(
"The 'listaddresses' command requires 2 parameters: 'start_index' and 'count'",
)
})?;
list_addresses(control, params)?
}
"listcoins" => serde_json::json!(&control.list_coins()),
"listconfirmed" => {
let params = req.params.ok_or_else(|| {
Expand Down

0 comments on commit d4f0569

Please sign in to comment.