start_regtest.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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::CdkLdkNode;
  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 cdk_ldk = CdkLdkNode::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 inner_node = cdk_ldk.node();
  64. let temp_dir_clone = temp_dir.clone();
  65. let (tx, rx) = oneshot::channel();
  66. tokio::spawn(async move {
  67. start_regtest_end(&temp_dir_clone, tx, shutdown_clone, Some(inner_node))
  68. .await
  69. .expect("Error starting regtest");
  70. });
  71. match timeout(Duration::from_secs(300), rx).await {
  72. Ok(_) => {
  73. tracing::info!("Regtest set up");
  74. signal_progress(&temp_dir);
  75. }
  76. Err(_) => {
  77. tracing::error!("regtest setup timed out after 5 minutes");
  78. anyhow::bail!("Could not set up regtest");
  79. }
  80. }
  81. let shutdown_future = async {
  82. // Wait for Ctrl+C signal
  83. signal::ctrl_c()
  84. .await
  85. .expect("failed to install CTRL+C handler");
  86. tracing::info!("Shutdown signal received");
  87. println!("\nReceived Ctrl+C, shutting down mints...");
  88. shutdown_clone_two.notify_waiters();
  89. };
  90. shutdown_future.await;
  91. Ok(())
  92. }