mint.rs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. use std::ops::Deref;
  2. use std::str::FromStr;
  3. use std::sync::{Arc, RwLock};
  4. use cashu_ffi::{
  5. Amount, CheckSpendableRequest, CheckSpendableResponse, Id, KeySet, KeySetResponse,
  6. KeysResponse, MeltBolt11Request, MeltBolt11Response, MintBolt11Request, MintBolt11Response,
  7. Secret, SwapRequest, SwapResponse,
  8. };
  9. use cashu_sdk::mint::Mint as MintSdk;
  10. use cashu_sdk::Mnemonic;
  11. use crate::error::Result;
  12. use crate::types::MintKeySetInfo;
  13. use crate::CashuSdkError;
  14. pub struct Mint {
  15. inner: RwLock<MintSdk>,
  16. }
  17. impl Mint {
  18. pub fn new(
  19. secret: String,
  20. keysets_info: Vec<Arc<MintKeySetInfo>>,
  21. spent_secrets: Vec<Arc<Secret>>,
  22. min_fee_reserve: Arc<Amount>,
  23. percent_fee_reserve: f32,
  24. ) -> Result<Self> {
  25. let spent_secrets = spent_secrets
  26. .into_iter()
  27. .map(|s| s.as_ref().deref().clone())
  28. .collect();
  29. let keysets = keysets_info
  30. .into_iter()
  31. .map(|ik| ik.as_ref().deref().clone())
  32. .collect();
  33. let menemonic = Mnemonic::from_str(&secret).map_err(|_| CashuSdkError::Generic {
  34. err: "Invalid Mnemonic".to_string(),
  35. })?;
  36. Ok(Self {
  37. inner: MintSdk::new(
  38. menemonic,
  39. keysets,
  40. spent_secrets,
  41. // TODO: quotes
  42. vec![],
  43. *min_fee_reserve.as_ref().deref(),
  44. percent_fee_reserve,
  45. )
  46. .into(),
  47. })
  48. }
  49. pub fn keyset_pubkeys(&self, keyset_id: Arc<Id>) -> Option<Arc<KeysResponse>> {
  50. self.inner
  51. .read()
  52. .unwrap()
  53. .keyset_pubkeys(&keyset_id)
  54. .map(|keyset| Arc::new(keyset.into()))
  55. }
  56. pub fn keysets(&self) -> Arc<KeySetResponse> {
  57. Arc::new(self.inner.read().unwrap().keysets().into())
  58. }
  59. pub fn keyset(&self, id: Arc<Id>) -> Option<Arc<KeySet>> {
  60. self.inner
  61. .read()
  62. .unwrap()
  63. .keyset(&id)
  64. .map(|k| Arc::new(k.into()))
  65. }
  66. pub fn process_mint_request(
  67. &self,
  68. mint_request: Arc<MintBolt11Request>,
  69. ) -> Result<Arc<MintBolt11Response>> {
  70. Ok(Arc::new(
  71. self.inner
  72. .write()
  73. .unwrap()
  74. .process_mint_request(mint_request.as_ref().deref().clone())?
  75. .into(),
  76. ))
  77. }
  78. pub fn process_swap_request(
  79. &self,
  80. split_request: Arc<SwapRequest>,
  81. ) -> Result<Arc<SwapResponse>> {
  82. Ok(Arc::new(
  83. self.inner
  84. .write()
  85. .unwrap()
  86. .process_swap_request(split_request.as_ref().deref().clone())?
  87. .into(),
  88. ))
  89. }
  90. pub fn check_spendable(
  91. &self,
  92. check_spendable: Arc<CheckSpendableRequest>,
  93. ) -> Result<Arc<CheckSpendableResponse>> {
  94. Ok(Arc::new(
  95. self.inner
  96. .read()
  97. .unwrap()
  98. .check_spendable(check_spendable.as_ref().deref())?
  99. .into(),
  100. ))
  101. }
  102. pub fn verify_melt_request(&self, melt_request: Arc<MeltBolt11Request>) -> Result<()> {
  103. Ok(self
  104. .inner
  105. .write()
  106. .unwrap()
  107. .verify_melt_request(melt_request.as_ref().deref())?)
  108. }
  109. pub fn process_melt_request(
  110. &self,
  111. melt_request: Arc<MeltBolt11Request>,
  112. preimage: String,
  113. total_spent: Arc<Amount>,
  114. ) -> Result<Arc<MeltBolt11Response>> {
  115. Ok(Arc::new(
  116. self.inner
  117. .write()
  118. .unwrap()
  119. .process_melt_request(
  120. melt_request.as_ref().deref(),
  121. &preimage,
  122. *total_spent.as_ref().deref(),
  123. )?
  124. .into(),
  125. ))
  126. }
  127. }