Skip to content

Commit 67ef0cf

Browse files
committed
feat(client): add get_block_infos
1 parent c61d680 commit 67ef0cf

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

src/async.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,24 @@ impl<S: Sleeper> AsyncClient<S> {
577577
Ok(blocks)
578578
}
579579

580+
/// Get summaries about recent blocks as [`BlockInfo`]s,
581+
/// starting at the tip, or at `height`, if provided.
582+
///
583+
/// The maximum number of elements returned depends on the backend itself:
584+
/// - Esplora returns `10`
585+
/// - [mempool.space](https://mempool.space/docs/api) returns `15`
586+
pub async fn get_block_infos(&self, height: Option<u32>) -> Result<Vec<BlockInfo>, Error> {
587+
let path = match height {
588+
Some(height) => format!("/blocks/{height}"),
589+
None => "/blocks".to_string(),
590+
};
591+
let blocks: Vec<BlockInfo> = self.get_response_json(&path).await?;
592+
if blocks.is_empty() {
593+
return Err(Error::InvalidResponse);
594+
}
595+
Ok(blocks)
596+
}
597+
580598
/// Get all UTXOs locked to an address.
581599
pub async fn get_address_utxos(&self, address: &Address) -> Result<Vec<Utxo>, Error> {
582600
let path = format!("/address/{address}/utxo");

src/blocking.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,24 @@ impl BlockingClient {
511511
Ok(blocks)
512512
}
513513

514+
/// Get summaries about recent blocks as [`BlockInfo`]s,
515+
/// starting at the tip, or at `height`, if provided.
516+
///
517+
/// The maximum number of elements returned depends on the backend itself:
518+
/// - Esplora returns `10`
519+
/// - [mempool.space](https://mempool.space/docs/api) returns `15`
520+
pub fn get_block_infos(&self, height: Option<u32>) -> Result<Vec<BlockInfo>, Error> {
521+
let path = match height {
522+
Some(height) => format!("/blocks/{height}"),
523+
None => "/blocks".to_string(),
524+
};
525+
let blocks: Vec<BlockInfo> = self.get_response_json(&path)?;
526+
if blocks.is_empty() {
527+
return Err(Error::InvalidResponse);
528+
}
529+
Ok(blocks)
530+
}
531+
514532
/// Get all UTXOs locked to an address.
515533
pub fn get_address_utxos(&self, address: &Address) -> Result<Vec<Utxo>, Error> {
516534
let path = format!("/address/{address}/utxo");

src/lib.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,41 @@ mod test {
10361036
assert_eq!(blocks_genesis, blocks_genesis_async);
10371037
}
10381038

1039+
#[cfg(all(feature = "blocking", feature = "async"))]
1040+
#[tokio::test]
1041+
async fn test_get_block_infos() {
1042+
let (blocking_client, async_client) = setup_clients().await;
1043+
1044+
let start_height = BITCOIND.client.get_block_count().unwrap().0;
1045+
1046+
let blocks_blocking_0 = blocking_client.get_block_infos(None).unwrap();
1047+
let blocks_async_0 = async_client.get_block_infos(None).await.unwrap();
1048+
assert_eq!(blocks_blocking_0[0].height, start_height as u32);
1049+
assert_eq!(blocks_blocking_0, blocks_async_0);
1050+
1051+
generate_blocks_and_wait(10);
1052+
1053+
let blocks_blocking_1 = blocking_client.get_block_infos(None).unwrap();
1054+
let blocks_async_1 = async_client.get_block_infos(None).await.unwrap();
1055+
assert_eq!(blocks_blocking_1, blocks_async_1);
1056+
assert_ne!(blocks_blocking_0, blocks_blocking_1);
1057+
1058+
let blocks_blocking_2 = blocking_client
1059+
.get_block_infos(Some(start_height as u32))
1060+
.unwrap();
1061+
let blocks_async_3 = async_client
1062+
.get_block_infos(Some(start_height as u32))
1063+
.await
1064+
.unwrap();
1065+
assert_eq!(blocks_blocking_2, blocks_async_3);
1066+
assert_eq!(blocks_blocking_2[0].height, start_height as u32);
1067+
assert_eq!(blocks_blocking_2, blocks_blocking_0);
1068+
1069+
let blocks_blocking_genesis = blocking_client.get_block_infos(Some(0)).unwrap();
1070+
let blocks_async_genesis = async_client.get_block_infos(Some(0)).await.unwrap();
1071+
assert_eq!(blocks_blocking_genesis, blocks_async_genesis);
1072+
}
1073+
10391074
#[cfg(all(feature = "blocking", feature = "async"))]
10401075
#[tokio::test]
10411076
async fn test_get_tx_with_http_header() {

0 commit comments

Comments
 (0)