Skip to content

Commit 7d9e179

Browse files
author
Ludo Galabru
committed
feat: chainhook-sdk config niteties
1 parent c7672f9 commit 7d9e179

File tree

3 files changed

+130
-11
lines changed

3 files changed

+130
-11
lines changed

components/chainhook-sdk/src/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ extern crate serde_json;
1212
pub extern crate bitcoincore_rpc;
1313
pub extern crate dashmap;
1414
pub extern crate fxhash;
15+
pub extern crate stacks_rpc_client;
1516

1617
pub use chainhook_types;
1718

@@ -25,3 +26,10 @@ pub extern crate rocksdb;
2526

2627
#[cfg(feature = "ordinals")]
2728
pub mod hord;
29+
30+
// TODO
31+
// pub mod clarity {
32+
// pub use stacks_rpc_client::clarity::stacks_common::*;
33+
// pub use stacks_rpc_client::clarity::vm::*;
34+
// pub use stacks_rpc_client::clarity::*;
35+
// }

components/chainhook-sdk/src/observer/mod.rs

+72-5
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,7 @@ use crate::hord::{
1818
revert_hord_db_with_augmented_bitcoin_block, update_hord_db_and_augment_bitcoin_block,
1919
HordConfig,
2020
};
21-
use crate::indexer::bitcoin::{
22-
standardize_bitcoin_block, BitcoinBlockFullBreakdown,
23-
};
21+
use crate::indexer::bitcoin::{standardize_bitcoin_block, BitcoinBlockFullBreakdown};
2422
use crate::indexer::{Indexer, IndexerConfig};
2523
use crate::utils::{send_request, Context};
2624

@@ -68,7 +66,7 @@ pub enum Event {
6866
}
6967

7068
// TODO(lgalabru): Support for GRPC?
71-
#[derive(Clone, Debug)]
69+
#[derive(Deserialize, Debug, Clone)]
7270
pub enum EventHandler {
7371
WebHook(String),
7472
}
@@ -120,7 +118,7 @@ impl EventHandler {
120118
async fn notify_bitcoin_transaction_proxied(&self) {}
121119
}
122120

123-
#[derive(Clone, Debug)]
121+
#[derive(Debug, Clone)]
124122
pub struct EventObserverConfig {
125123
pub chainhook_config: Option<ChainhookConfig>,
126124
pub bitcoin_rpc_proxy_enabled: bool,
@@ -139,6 +137,20 @@ pub struct EventObserverConfig {
139137
pub hord_config: Option<HordConfig>,
140138
}
141139

140+
#[derive(Deserialize, Debug, Clone)]
141+
pub struct EventObserverConfigOverrides {
142+
pub ingestion_port: Option<u16>,
143+
pub bitcoind_rpc_username: Option<String>,
144+
pub bitcoind_rpc_password: Option<String>,
145+
pub bitcoind_rpc_url: Option<String>,
146+
pub bitcoind_zmq_url: Option<String>,
147+
pub stacks_node_rpc_url: Option<String>,
148+
pub display_logs: Option<bool>,
149+
pub cache_path: Option<String>,
150+
pub bitcoin_network: Option<String>,
151+
pub stacks_network: Option<String>,
152+
}
153+
142154
impl EventObserverConfig {
143155
pub fn get_cache_path_buf(&self) -> PathBuf {
144156
let mut path_buf = PathBuf::new();
@@ -156,6 +168,61 @@ impl EventObserverConfig {
156168
};
157169
bitcoin_config
158170
}
171+
172+
pub fn new_using_overrides(
173+
overrides: Option<&EventObserverConfigOverrides>,
174+
) -> Result<EventObserverConfig, String> {
175+
let stacks_node_rpc_url = overrides
176+
.and_then(|c| c.stacks_node_rpc_url.clone())
177+
.unwrap_or("http://localhost:20443".to_string());
178+
179+
let bitcoin_network =
180+
if let Some(network) = overrides.and_then(|c| c.bitcoin_network.as_ref()) {
181+
BitcoinNetwork::from_str(network)?
182+
} else {
183+
BitcoinNetwork::Regtest
184+
};
185+
186+
let stacks_network =
187+
if let Some(network) = overrides.and_then(|c| c.stacks_network.as_ref()) {
188+
StacksNetwork::from_str(network)?
189+
} else {
190+
StacksNetwork::Devnet
191+
};
192+
193+
let config = EventObserverConfig {
194+
bitcoin_rpc_proxy_enabled: false,
195+
event_handlers: vec![],
196+
chainhook_config: None,
197+
ingestion_port: overrides
198+
.and_then(|c| c.ingestion_port)
199+
.unwrap_or(DEFAULT_INGESTION_PORT),
200+
bitcoind_rpc_username: overrides
201+
.and_then(|c| c.bitcoind_rpc_username.clone())
202+
.unwrap_or("devnet".to_string()),
203+
bitcoind_rpc_password: overrides
204+
.and_then(|c| c.bitcoind_rpc_password.clone())
205+
.unwrap_or("devnet".to_string()),
206+
bitcoind_rpc_url: overrides
207+
.and_then(|c| c.bitcoind_rpc_url.clone())
208+
.unwrap_or("http://localhost:18443".to_string()),
209+
bitcoin_block_signaling: overrides
210+
.and_then(|c| match c.bitcoind_zmq_url.as_ref() {
211+
Some(url) => Some(BitcoinBlockSignaling::ZeroMQ(url.clone())),
212+
None => Some(BitcoinBlockSignaling::Stacks(stacks_node_rpc_url.clone())),
213+
})
214+
.unwrap_or(BitcoinBlockSignaling::Stacks(stacks_node_rpc_url.clone())),
215+
stacks_node_rpc_url,
216+
display_logs: overrides.and_then(|c| c.display_logs).unwrap_or(false),
217+
cache_path: overrides
218+
.and_then(|c| c.cache_path.clone())
219+
.unwrap_or("cache".to_string()),
220+
bitcoin_network,
221+
stacks_network,
222+
hord_config: None,
223+
};
224+
Ok(config)
225+
}
159226
}
160227

161228
#[derive(Deserialize, Debug)]

components/chainhook-types-rs/src/rosetta.rs

+50-6
Original file line numberDiff line numberDiff line change
@@ -701,12 +701,24 @@ impl StacksChainEvent {
701701
}
702702
}
703703

704-
pub fn new_block(&self) -> Option<&StacksBlockData> {
704+
pub fn get_latest_block_identifier(&self) -> Option<&BlockIdentifier> {
705705
match self {
706-
StacksChainEvent::ChainUpdatedWithBlocks(event) => {
707-
event.new_blocks.first().and_then(|b| Some(&b.block))
708-
}
709-
_ => None,
706+
StacksChainEvent::ChainUpdatedWithBlocks(event) => event
707+
.new_blocks
708+
.last()
709+
.and_then(|b| Some(&b.block.block_identifier)),
710+
StacksChainEvent::ChainUpdatedWithReorg(event) => event
711+
.blocks_to_apply
712+
.last()
713+
.and_then(|b| Some(&b.block.block_identifier)),
714+
StacksChainEvent::ChainUpdatedWithMicroblocks(event) => event
715+
.new_microblocks
716+
.first()
717+
.and_then(|b| Some(&b.metadata.anchor_block_identifier)),
718+
StacksChainEvent::ChainUpdatedWithMicroblocksReorg(event) => event
719+
.microblocks_to_apply
720+
.first()
721+
.and_then(|b| Some(&b.metadata.anchor_block_identifier)),
710722
}
711723
}
712724
}
@@ -764,6 +776,21 @@ pub enum StacksNetwork {
764776
}
765777

766778
impl StacksNetwork {
779+
pub fn from_str(network: &str) -> Result<StacksNetwork, String> {
780+
let value = match network {
781+
"devnet" => StacksNetwork::Devnet,
782+
"testnet" => StacksNetwork::Testnet,
783+
"mainnet" => StacksNetwork::Mainnet,
784+
_ => {
785+
return Err(format!(
786+
"network '{}' unsupported (mainnet, testnet, devnet, simnet)",
787+
network
788+
))
789+
}
790+
};
791+
Ok(value)
792+
}
793+
767794
pub fn is_simnet(&self) -> bool {
768795
match self {
769796
StacksNetwork::Simnet => true,
@@ -827,7 +854,24 @@ pub enum BitcoinNetwork {
827854
Mainnet,
828855
}
829856

830-
#[derive(Debug, Clone)]
857+
impl BitcoinNetwork {
858+
pub fn from_str(network: &str) -> Result<BitcoinNetwork, String> {
859+
let value = match network {
860+
"regtest" => BitcoinNetwork::Regtest,
861+
"testnet" => BitcoinNetwork::Testnet,
862+
"mainnet" => BitcoinNetwork::Mainnet,
863+
_ => {
864+
return Err(format!(
865+
"network '{}' unsupported (mainnet, testnet, regtest)",
866+
network
867+
))
868+
}
869+
};
870+
Ok(value)
871+
}
872+
}
873+
874+
#[derive(Deserialize, Debug, Clone)]
831875
pub enum BitcoinBlockSignaling {
832876
Stacks(String),
833877
ZeroMQ(String),

0 commit comments

Comments
 (0)