1use crate::layer2::{
2 BobClient, Layer2ProtocolTrait, Layer2ProtocolType, LightningNetwork, LiquidModule, Proof,
3 RskClient, StacksClient, StateChannel, TaprootAssetsProtocol,
4};
5
6pub struct Layer2Manager {
8 bob_client: Option<BobClient>,
9 liquid_module: Option<LiquidModule>,
10 rsk_client: Option<RskClient>,
11 stacks_client: Option<StacksClient>,
12 taproot_assets: Option<TaprootAssetsProtocol>,
13 #[allow(dead_code)] lightning_network: Option<LightningNetwork>,
15 #[allow(dead_code)] state_channels: Option<StateChannel>,
17}
18
19impl Default for Layer2Manager {
20 fn default() -> Self {
21 Self::new()
22 }
23}
24
25impl Layer2Manager {
26 pub fn new() -> Self {
28 Self {
29 bob_client: None,
30 liquid_module: None,
31 rsk_client: None,
32 stacks_client: None,
33 taproot_assets: None,
34 lightning_network: None,
35 state_channels: None,
36 }
37 }
38
39 pub fn initialize_all(&mut self) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
41 self.bob_client = Some(BobClient::default());
46 if let Some(client) = &mut self.bob_client {
47 if let Err(e) = client.initialize() {
48 eprintln!("Failed to initialize BobClient: {e}");
49 return Err(e);
50 }
51 println!("BobClient initialized successfully");
52 }
53
54 self.liquid_module = Some(LiquidModule::default());
56 if let Some(module) = &mut self.liquid_module {
57 if let Err(e) = module.initialize() {
58 eprintln!("Failed to initialize LiquidModule: {e}");
59 return Err(e);
60 }
61 println!("LiquidModule initialized successfully");
62 }
63
64 self.rsk_client = Some(RskClient::default());
66 if let Some(client) = &mut self.rsk_client {
67 if let Err(e) = client.initialize() {
68 eprintln!("Failed to initialize RskClient: {e}");
69 return Err(e);
70 }
71 println!("RskClient initialized successfully");
72 }
73
74 self.stacks_client = Some(StacksClient::default());
76 if let Some(client) = &mut self.stacks_client {
77 if let Err(e) = client.initialize() {
78 eprintln!("Failed to initialize StacksClient: {e}");
79 return Err(e);
80 }
81 println!("StacksClient initialized successfully");
82 }
83
84 self.taproot_assets = Some(TaprootAssetsProtocol::default());
86 if let Some(protocol) = &mut self.taproot_assets {
87 if let Err(e) = protocol.initialize() {
88 eprintln!("Failed to initialize TaprootAssetsProtocol: {e}");
89 return Err(e);
90 }
91 println!("TaprootAssetsProtocol initialized successfully");
92 }
93
94 println!("All Layer 2 protocols initialized successfully");
95 Ok(())
96 }
97
98 pub async fn initialize_all_async(
100 &mut self,
101 ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
102 self.bob_client = Some(BobClient::default());
104 if let Some(client) = &self.bob_client {
105 client.initialize()?; println!("BobClient initialized asynchronously");
107 }
108
109 self.liquid_module = Some(LiquidModule::default());
111 if let Some(module) = &self.liquid_module {
112 module.initialize()?; println!("LiquidModule initialized asynchronously");
114 }
115
116 self.rsk_client = Some(RskClient::default());
118 if let Some(client) = &self.rsk_client {
119 client.initialize()?; println!("RskClient initialized asynchronously");
121 }
122
123 self.stacks_client = Some(StacksClient::default());
125 if let Some(client) = &self.stacks_client {
126 client.initialize()?; println!("StacksClient initialized asynchronously");
128 }
129
130 self.taproot_assets = Some(TaprootAssetsProtocol::default());
132 if let Some(protocol) = &self.taproot_assets {
133 protocol.initialize()?; println!("TaprootAssetsProtocol initialized asynchronously");
135 }
136
137 self.lightning_network = Some(LightningNetwork::default());
139 if let Some(network) = &self.lightning_network {
140 network.initialize()?; println!("LightningNetwork initialized asynchronously");
142 }
143
144 self.state_channels = Some(StateChannel::default());
146 if let Some(channel) = &self.state_channels {
147 channel.initialize()?; println!("StateChannel initialized asynchronously");
149 }
150
151 println!("All Layer 2 protocols initialized asynchronously");
152 Ok(())
153 }
154
155 pub fn get_protocol(
157 &self,
158 protocol_type: Layer2ProtocolType,
159 ) -> Option<&dyn Layer2ProtocolTrait> {
160 match protocol_type {
161 Layer2ProtocolType::BOB => self
162 .bob_client
163 .as_ref()
164 .map(|c| c as &dyn Layer2ProtocolTrait),
165 Layer2ProtocolType::Liquid => self
166 .liquid_module
167 .as_ref()
168 .map(|c| c as &dyn Layer2ProtocolTrait),
169 Layer2ProtocolType::RSK => self
170 .rsk_client
171 .as_ref()
172 .map(|c| c as &dyn Layer2ProtocolTrait),
173 Layer2ProtocolType::Stacks => self
174 .stacks_client
175 .as_ref()
176 .map(|c| c as &dyn Layer2ProtocolTrait),
177 Layer2ProtocolType::TaprootAssets => self
178 .taproot_assets
179 .as_ref()
180 .map(|c| c as &dyn Layer2ProtocolTrait),
181 _ => None,
182 }
183 }
184
185 pub fn get_protocol_async(
187 &self,
188 protocol_type: Layer2ProtocolType,
189 ) -> Option<&dyn crate::layer2::Layer2Protocol> {
190 match protocol_type {
191 Layer2ProtocolType::BOB => self
192 .bob_client
193 .as_ref()
194 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
195 Layer2ProtocolType::Liquid => self
196 .liquid_module
197 .as_ref()
198 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
199 Layer2ProtocolType::RSK => self
200 .rsk_client
201 .as_ref()
202 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
203 Layer2ProtocolType::Stacks => self
204 .stacks_client
205 .as_ref()
206 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
207 Layer2ProtocolType::TaprootAssets => self
208 .taproot_assets
209 .as_ref()
210 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
211 Layer2ProtocolType::Lightning => self
212 .lightning_network
213 .as_ref()
214 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
215 Layer2ProtocolType::StateChannels => self
216 .state_channels
217 .as_ref()
218 .map(|c| c as &dyn crate::layer2::Layer2Protocol),
219 _ => None,
220 }
221 }
222
223 pub fn cross_layer_transfer(
225 &self,
226 from_protocol: Layer2ProtocolType,
227 to_protocol: Layer2ProtocolType,
228 asset_id: &str,
229 amount: u64,
230 ) -> Result<String, Box<dyn std::error::Error + Send + Sync>> {
231 println!("Executing cross-layer transfer from {from_protocol:?} to {to_protocol:?}");
232
233 let transfer_id = format!(
234 "cross_{}_{}_{}_{}",
235 protocol_name(from_protocol),
236 protocol_name(to_protocol),
237 asset_id,
238 amount
239 );
240
241 Ok(transfer_id)
242 }
243
244 pub async fn cross_layer_transfer_async(
246 &self,
247 from_protocol: Layer2ProtocolType,
248 to_protocol: Layer2ProtocolType,
249 asset_id: &str,
250 amount: u64,
251 ) -> Result<String, Box<dyn std::error::Error + Send + Sync>> {
252 println!(
253 "Asynchronously executing cross-layer transfer from {from_protocol:?} to {to_protocol:?}"
254 );
255
256 let source = self.get_protocol_async(from_protocol);
257 let destination = self.get_protocol_async(to_protocol);
258
259 if source.is_none() || destination.is_none() {
260 return Err(Box::new(std::io::Error::new(
261 std::io::ErrorKind::NotFound,
262 "Source or destination protocol not found",
263 )));
264 }
265
266 let transfer_id = format!(
269 "cross_{}_{}_{}_{}",
270 protocol_name(from_protocol),
271 protocol_name(to_protocol),
272 asset_id,
273 amount
274 );
275
276 Ok(transfer_id)
277 }
278
279 pub fn verify_cross_layer_proof(
281 &self,
282 proof: Proof,
283 protocols: Vec<Layer2ProtocolType>,
284 ) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> {
285 println!(
286 "Verifying cross-layer proof across {} protocols",
287 protocols.len()
288 );
289
290 for protocol_type in protocols {
291 if let Some(protocol) = self.get_protocol(protocol_type) {
292 if !protocol.verify_proof(proof.clone())?.is_valid {
293 return Ok(false);
294 }
295 }
296 }
297
298 Ok(true)
299 }
300
301 pub async fn verify_cross_layer_proof_async(
303 &self,
304 proof: Proof,
305 protocols: Vec<Layer2ProtocolType>,
306 ) -> Result<bool, Box<dyn std::error::Error + Send + Sync>> {
307 println!(
308 "Asynchronously verifying cross-layer proof across {} protocols",
309 protocols.len()
310 );
311
312 for protocol_type in &protocols {
313 if let Some(protocol) = self.get_protocol_async(*protocol_type) {
314 let result = protocol.verify_proof(proof.clone()).await?;
315 if !result.is_valid {
316 return Ok(false);
317 }
318 } else {
319 return Err(Box::new(std::io::Error::new(
320 std::io::ErrorKind::NotFound,
321 format!("{protocol_type:?} protocol not found"),
322 )));
323 }
324 }
325
326 Ok(true)
328 }
329}
330
331fn protocol_name(protocol: Layer2ProtocolType) -> &'static str {
332 match protocol {
333 Layer2ProtocolType::Lightning => "lightning",
334 Layer2ProtocolType::StateChannels => "state_channels",
335 Layer2ProtocolType::RGB => "rgb",
336 Layer2ProtocolType::DLC => "dlc",
337 Layer2ProtocolType::BOB => "bob",
338 Layer2ProtocolType::Liquid => "liquid",
339 Layer2ProtocolType::RSK => "rsk",
340 Layer2ProtocolType::Stacks => "stacks",
341 Layer2ProtocolType::TaprootAssets => "taproot_assets",
342 }
343}
344
345#[cfg(test)]
346mod tests {
347 use super::*;
348
349 #[test]
350 fn test_layer2_manager_initialization() {
351 let mut manager = Layer2Manager::new();
352 assert!(manager.initialize_all().is_ok());
353 }
354
355 #[test]
356 fn test_all_protocols_available() {
357 let mut manager = Layer2Manager::new();
358 manager.initialize_all().unwrap();
359
360 assert!(manager.get_protocol(Layer2ProtocolType::BOB).is_some());
361 assert!(manager.get_protocol(Layer2ProtocolType::Liquid).is_some());
362 assert!(manager.get_protocol(Layer2ProtocolType::RSK).is_some());
363 assert!(manager.get_protocol(Layer2ProtocolType::Stacks).is_some());
364 assert!(manager
365 .get_protocol(Layer2ProtocolType::TaprootAssets)
366 .is_some());
367 }
368
369 #[test]
370 fn test_cross_layer_transfer() {
371 let mut manager = Layer2Manager::new();
372 manager.initialize_all().unwrap();
373
374 let result = manager.cross_layer_transfer(
375 Layer2ProtocolType::BOB,
376 Layer2ProtocolType::Liquid,
377 "test_asset",
378 1000,
379 );
380
381 assert!(result.is_ok());
382 let transfer_id = result.unwrap();
383 assert!(transfer_id.contains("bob_liquid"));
384 }
385}