start_regtest.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use std::fs::OpenOptions;
  2. use std::io::Write;
  3. use std::path::{Path, PathBuf};
  4. use std::str::FromStr;
  5. use std::sync::Arc;
  6. use std::time::Duration;
  7. use anyhow::Result;
  8. use cashu::Amount;
  9. use cdk_integration_tests::cli::{init_logging, CommonArgs};
  10. use cdk_integration_tests::init_regtest::start_regtest_end;
  11. use cdk_ldk_node::CdkLdkNodeBuilder;
  12. use clap::Parser;
  13. use ldk_node::lightning::ln::msgs::SocketAddress;
  14. use tokio::signal;
  15. use tokio::sync::{oneshot, Notify};
  16. use tokio::time::timeout;
  17. #[derive(Parser)]
  18. #[command(name = "start-regtest")]
  19. #[command(about = "Start regtest environment", long_about = None)]
  20. struct Args {
  21. #[command(flatten)]
  22. common: CommonArgs,
  23. /// Working directory path
  24. work_dir: String,
  25. }
  26. fn signal_progress(work_dir: &Path) {
  27. let mut pipe = OpenOptions::new()
  28. .write(true)
  29. .open(work_dir.join("progress_pipe"))
  30. .expect("Failed to open pipe");
  31. pipe.write_all(b"checkpoint1\n")
  32. .expect("Failed to write to pipe");
  33. }
  34. #[tokio::main]
  35. async fn main() -> Result<()> {
  36. let args = Args::parse();
  37. // Initialize logging based on CLI arguments
  38. init_logging(args.common.enable_logging, args.common.log_level);
  39. let temp_dir = PathBuf::from_str(&args.work_dir)?;
  40. let shutdown_regtest = Arc::new(Notify::new());
  41. let shutdown_clone = Arc::clone(&shutdown_regtest);
  42. let shutdown_clone_two = Arc::clone(&shutdown_regtest);
  43. let ldk_work_dir = temp_dir.join("ldk_mint");
  44. let node_builder = CdkLdkNodeBuilder::new(
  45. bitcoin::Network::Regtest,
  46. cdk_ldk_node::ChainSource::BitcoinRpc(cdk_ldk_node::BitcoinRpcConfig {
  47. host: "127.0.0.1".to_string(),
  48. port: 18443,
  49. user: "testuser".to_string(),
  50. password: "testpass".to_string(),
  51. }),
  52. cdk_ldk_node::GossipSource::P2P,
  53. ldk_work_dir.to_string_lossy().to_string(),
  54. cdk_common::common::FeeReserve {
  55. min_fee_reserve: Amount::ZERO,
  56. percent_fee_reserve: 0.0,
  57. },
  58. vec![SocketAddress::TcpIpV4 {
  59. addr: [127, 0, 0, 1],
  60. port: 8092,
  61. }],
  62. );
  63. let cdk_ldk = node_builder.build()?;
  64. let inner_node = cdk_ldk.node();
  65. let temp_dir_clone = temp_dir.clone();
  66. let (tx, rx) = oneshot::channel();
  67. tokio::spawn(async move {
  68. start_regtest_end(&temp_dir_clone, tx, shutdown_clone, Some(inner_node))
  69. .await
  70. .expect("Error starting regtest");
  71. });
  72. match timeout(Duration::from_secs(300), rx).await {
  73. Ok(_) => {
  74. tracing::info!("Regtest set up");
  75. signal_progress(&temp_dir);
  76. }
  77. Err(_) => {
  78. tracing::error!("regtest setup timed out after 5 minutes");
  79. anyhow::bail!("Could not set up regtest");
  80. }
  81. }
  82. let shutdown_future = async {
  83. // Wait for Ctrl+C signal
  84. signal::ctrl_c()
  85. .await
  86. .expect("failed to install CTRL+C handler");
  87. tracing::info!("Shutdown signal received");
  88. println!("\nReceived Ctrl+C, shutting down mints...");
  89. shutdown_clone_two.notify_waiters();
  90. };
  91. shutdown_future.await;
  92. Ok(())
  93. }