mint.rs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. use std::ops::Deref;
  2. use std::sync::{Arc, RwLock};
  3. use cashu_ffi::{
  4. Amount, CheckSpendableRequest, CheckSpendableResponse, Id, KeySet, KeySetInfo, KeySetResponse,
  5. KeysResponse, MeltRequest, MeltResponse, MintKeySet, MintRequest, PostMintResponse, Secret,
  6. SplitRequest, SplitResponse,
  7. };
  8. use cashu_sdk::mint::Mint as MintSdk;
  9. use crate::error::Result;
  10. pub struct Mint {
  11. inner: RwLock<MintSdk>,
  12. }
  13. impl Mint {
  14. pub fn new(
  15. secret: String,
  16. derivation_path: String,
  17. inactive_keysets: Vec<Arc<KeySetInfo>>,
  18. spent_secrets: Vec<Arc<Secret>>,
  19. max_order: u8,
  20. min_fee_reserve: Arc<Amount>,
  21. percent_fee_reserve: f32,
  22. ) -> Result<Self> {
  23. let spent_secrets = spent_secrets
  24. .into_iter()
  25. .map(|s| s.as_ref().deref().clone())
  26. .collect();
  27. let inactive_keysets = inactive_keysets
  28. .into_iter()
  29. .map(|ik| ik.as_ref().deref().clone())
  30. .collect();
  31. Ok(Self {
  32. inner: MintSdk::new(
  33. &secret,
  34. &derivation_path,
  35. inactive_keysets,
  36. spent_secrets,
  37. max_order,
  38. *min_fee_reserve.as_ref().deref(),
  39. percent_fee_reserve,
  40. )
  41. .into(),
  42. })
  43. }
  44. pub fn active_keyset_pubkeys(&self) -> Arc<KeysResponse> {
  45. Arc::new(self.inner.read().unwrap().active_keyset_pubkeys().into())
  46. }
  47. pub fn keysets(&self) -> Arc<KeySetResponse> {
  48. Arc::new(self.inner.read().unwrap().keysets().into())
  49. }
  50. pub fn active_keyset(&self) -> Arc<MintKeySet> {
  51. Arc::new(self.inner.read().unwrap().active_keyset.clone().into())
  52. }
  53. pub fn keyset(&self, id: Arc<Id>) -> Option<Arc<KeySet>> {
  54. self.inner
  55. .read()
  56. .unwrap()
  57. .keyset(&id)
  58. .map(|k| Arc::new(k.into()))
  59. }
  60. pub fn process_mint_request(
  61. &self,
  62. mint_request: Arc<MintRequest>,
  63. ) -> Result<Arc<PostMintResponse>> {
  64. Ok(Arc::new(
  65. self.inner
  66. .write()
  67. .unwrap()
  68. .process_mint_request(mint_request.as_ref().deref().clone())?
  69. .into(),
  70. ))
  71. }
  72. pub fn process_split_request(
  73. &self,
  74. split_request: Arc<SplitRequest>,
  75. ) -> Result<Arc<SplitResponse>> {
  76. Ok(Arc::new(
  77. self.inner
  78. .write()
  79. .unwrap()
  80. .process_split_request(split_request.as_ref().deref().clone())?
  81. .into(),
  82. ))
  83. }
  84. pub fn check_spendable(
  85. &self,
  86. check_spendable: Arc<CheckSpendableRequest>,
  87. ) -> Result<Arc<CheckSpendableResponse>> {
  88. Ok(Arc::new(
  89. self.inner
  90. .read()
  91. .unwrap()
  92. .check_spendable(check_spendable.as_ref().deref())?
  93. .into(),
  94. ))
  95. }
  96. pub fn verify_melt_request(&self, melt_request: Arc<MeltRequest>) -> Result<()> {
  97. Ok(self
  98. .inner
  99. .write()
  100. .unwrap()
  101. .verify_melt_request(melt_request.as_ref().deref())?)
  102. }
  103. pub fn process_melt_request(
  104. &self,
  105. melt_request: Arc<MeltRequest>,
  106. preimage: String,
  107. total_spent: Arc<Amount>,
  108. ) -> Result<Arc<MeltResponse>> {
  109. Ok(Arc::new(
  110. self.inner
  111. .write()
  112. .unwrap()
  113. .process_melt_request(
  114. melt_request.as_ref().deref(),
  115. &preimage,
  116. *total_spent.as_ref().deref(),
  117. )?
  118. .into(),
  119. ))
  120. }
  121. }