setup.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #[cfg(feature = "fakewallet")]
  2. use std::collections::HashMap;
  3. #[cfg(feature = "fakewallet")]
  4. use std::collections::HashSet;
  5. #[cfg(feature = "lnbits")]
  6. use std::sync::Arc;
  7. #[cfg(feature = "cln")]
  8. use anyhow::anyhow;
  9. use async_trait::async_trait;
  10. use axum::Router;
  11. #[cfg(feature = "fakewallet")]
  12. use bip39::rand::{thread_rng, Rng};
  13. use cdk::cdk_lightning::MintLightning;
  14. use cdk::mint::FeeReserve;
  15. #[cfg(feature = "lnbits")]
  16. use cdk::mint_url::MintUrl;
  17. use cdk::nuts::CurrencyUnit;
  18. #[cfg(feature = "lnbits")]
  19. use tokio::sync::Mutex;
  20. use crate::config::{self, Settings};
  21. #[cfg(feature = "cln")]
  22. use crate::expand_path;
  23. #[async_trait]
  24. pub trait LnBackendSetup {
  25. async fn setup(
  26. &self,
  27. routers: &mut Vec<Router>,
  28. settings: &Settings,
  29. unit: CurrencyUnit,
  30. ) -> anyhow::Result<impl MintLightning>;
  31. }
  32. #[cfg(feature = "cln")]
  33. #[async_trait]
  34. impl LnBackendSetup for config::Cln {
  35. async fn setup(
  36. &self,
  37. _routers: &mut Vec<Router>,
  38. _settings: &Settings,
  39. _unit: CurrencyUnit,
  40. ) -> anyhow::Result<cdk_cln::Cln> {
  41. let cln_socket = expand_path(
  42. self.rpc_path
  43. .to_str()
  44. .ok_or(anyhow!("cln socket not defined"))?,
  45. )
  46. .ok_or(anyhow!("cln socket not defined"))?;
  47. let fee_reserve = FeeReserve {
  48. min_fee_reserve: self.reserve_fee_min,
  49. percent_fee_reserve: self.fee_percent,
  50. };
  51. let cln = cdk_cln::Cln::new(cln_socket, fee_reserve).await?;
  52. Ok(cln)
  53. }
  54. }
  55. #[cfg(feature = "lnbits")]
  56. #[async_trait]
  57. impl LnBackendSetup for config::LNbits {
  58. async fn setup(
  59. &self,
  60. routers: &mut Vec<Router>,
  61. settings: &Settings,
  62. _unit: CurrencyUnit,
  63. ) -> anyhow::Result<cdk_lnbits::LNbits> {
  64. let admin_api_key = &self.admin_api_key;
  65. let invoice_api_key = &self.invoice_api_key;
  66. // Channel used for lnbits web hook
  67. let (sender, receiver) = tokio::sync::mpsc::channel(8);
  68. let webhook_endpoint = "/webhook/lnbits/sat/invoice";
  69. let mint_url: MintUrl = settings.info.url.parse()?;
  70. let webhook_url = mint_url.join(webhook_endpoint)?;
  71. let fee_reserve = FeeReserve {
  72. min_fee_reserve: self.reserve_fee_min,
  73. percent_fee_reserve: self.fee_percent,
  74. };
  75. let lnbits = cdk_lnbits::LNbits::new(
  76. admin_api_key.clone(),
  77. invoice_api_key.clone(),
  78. self.lnbits_api.clone(),
  79. fee_reserve,
  80. Arc::new(Mutex::new(Some(receiver))),
  81. webhook_url.to_string(),
  82. )
  83. .await?;
  84. let router = lnbits
  85. .create_invoice_webhook_router(webhook_endpoint, sender)
  86. .await?;
  87. routers.push(router);
  88. Ok(lnbits)
  89. }
  90. }
  91. #[cfg(feature = "lnd")]
  92. #[async_trait]
  93. impl LnBackendSetup for config::Lnd {
  94. async fn setup(
  95. &self,
  96. _routers: &mut Vec<Router>,
  97. _settings: &Settings,
  98. _unit: CurrencyUnit,
  99. ) -> anyhow::Result<cdk_lnd::Lnd> {
  100. let address = &self.address;
  101. let cert_file = &self.cert_file;
  102. let macaroon_file = &self.macaroon_file;
  103. let fee_reserve = FeeReserve {
  104. min_fee_reserve: self.reserve_fee_min,
  105. percent_fee_reserve: self.fee_percent,
  106. };
  107. let lnd = cdk_lnd::Lnd::new(
  108. address.to_string(),
  109. cert_file.clone(),
  110. macaroon_file.clone(),
  111. fee_reserve,
  112. )
  113. .await?;
  114. Ok(lnd)
  115. }
  116. }
  117. #[cfg(feature = "fakewallet")]
  118. #[async_trait]
  119. impl LnBackendSetup for config::FakeWallet {
  120. async fn setup(
  121. &self,
  122. _router: &mut Vec<Router>,
  123. _settings: &Settings,
  124. _unit: CurrencyUnit,
  125. ) -> anyhow::Result<cdk_fake_wallet::FakeWallet> {
  126. let fee_reserve = FeeReserve {
  127. min_fee_reserve: self.reserve_fee_min,
  128. percent_fee_reserve: self.fee_percent,
  129. };
  130. // calculate random delay time
  131. let mut rng = thread_rng();
  132. let delay_time = rng.gen_range(self.min_delay_time..=self.max_delay_time);
  133. let fake_wallet = cdk_fake_wallet::FakeWallet::new(
  134. fee_reserve,
  135. HashMap::default(),
  136. HashSet::default(),
  137. delay_time,
  138. );
  139. Ok(fake_wallet)
  140. }
  141. }