mint.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. use std::ops::Deref;
  2. #[cfg(feature = "nut07")]
  3. use cashu_js::nuts::{JsCheckSpendableRequest, JsCheckSpendableResponse};
  4. use cashu_js::nuts::{
  5. JsId, JsKeySet, JsKeySetsResponse, JsKeysResponse, JsMeltRequest, JsMeltResponse,
  6. JsMintRequest, JsPostMintResponse, JsSplitRequest, JsSplitResponse,
  7. };
  8. use cashu_js::JsAmount;
  9. use cashu_sdk::mint::Mint;
  10. use cashu_sdk::nuts::{KeySet, KeysResponse};
  11. use wasm_bindgen::prelude::*;
  12. use crate::error::{into_err, Result};
  13. #[wasm_bindgen(js_name = Mint)]
  14. pub struct JsMint {
  15. inner: Mint,
  16. }
  17. impl Deref for JsMint {
  18. type Target = Mint;
  19. fn deref(&self) -> &Self::Target {
  20. &self.inner
  21. }
  22. }
  23. impl From<Mint> for JsMint {
  24. fn from(inner: Mint) -> JsMint {
  25. JsMint { inner }
  26. }
  27. }
  28. #[wasm_bindgen(js_class = Mint)]
  29. impl JsMint {
  30. #[wasm_bindgen(constructor)]
  31. pub fn new(
  32. secret: String,
  33. keyset_info: JsValue,
  34. spent_secrets: JsValue,
  35. quotes: JsValue,
  36. min_fee_reserve: JsAmount,
  37. percent_fee_reserve: f32,
  38. ) -> Result<JsMint> {
  39. let keyset_info = serde_wasm_bindgen::from_value(keyset_info).map_err(into_err)?;
  40. let spent_secrets = serde_wasm_bindgen::from_value(spent_secrets).map_err(into_err)?;
  41. let quotes = serde_wasm_bindgen::from_value(quotes).map_err(into_err)?;
  42. Ok(JsMint {
  43. inner: Mint::new(
  44. &secret,
  45. keyset_info,
  46. spent_secrets,
  47. quotes,
  48. *min_fee_reserve.deref(),
  49. percent_fee_reserve,
  50. ),
  51. })
  52. }
  53. /// Get Active Keyset Pubkeys
  54. #[wasm_bindgen(getter)]
  55. pub fn keyset_pubkeys(&self, keyset_id: JsId) -> Result<JsKeysResponse> {
  56. let keyset: KeySet = self
  57. .inner
  58. .keyset(&keyset_id)
  59. .ok_or(JsError::new("Unknown Keyset"))?
  60. .clone()
  61. .into();
  62. Ok(KeysResponse { keys: keyset.keys }.into())
  63. }
  64. /// Get Keysets
  65. #[wasm_bindgen(js_name = keySets)]
  66. pub fn keysets(&self) -> JsKeySetsResponse {
  67. self.inner.keysets().into()
  68. }
  69. /// Keyset
  70. #[wasm_bindgen(js_name = KeySet)]
  71. pub fn keyset(&self, id: JsId) -> Option<JsKeySet> {
  72. self.inner.keyset(id.deref()).map(|ks| ks.into())
  73. }
  74. /// Process Mint Request
  75. #[wasm_bindgen(js_name = ProcessMintRequest)]
  76. pub fn process_mint_request(
  77. &mut self,
  78. mint_request: JsMintRequest,
  79. ) -> Result<JsPostMintResponse> {
  80. Ok(self
  81. .inner
  82. .process_mint_request(mint_request.deref().clone())
  83. .map_err(into_err)?
  84. .into())
  85. }
  86. /// Process Split Request
  87. #[wasm_bindgen(js_name = ProcessSplitRequest)]
  88. pub fn process_split_request(
  89. &mut self,
  90. split_request: JsSplitRequest,
  91. ) -> Result<JsSplitResponse> {
  92. Ok(self
  93. .inner
  94. .process_split_request(split_request.deref().clone())
  95. .map_err(into_err)?
  96. .into())
  97. }
  98. /// Check Spendable
  99. #[cfg(feature = "nut07")]
  100. #[wasm_bindgen(js_name = CheckSpendable)]
  101. pub fn check_spendable(
  102. &mut self,
  103. check_request: JsCheckSpendableRequest,
  104. ) -> Result<JsCheckSpendableResponse> {
  105. Ok(self
  106. .inner
  107. .check_spendable(&check_request.deref().clone())
  108. .map_err(into_err)?
  109. .into())
  110. }
  111. /// Check Verify Melt
  112. #[wasm_bindgen(js_name = VerifyMelt)]
  113. pub fn verify_melt(&mut self, melt_request: JsMeltRequest) -> Result<()> {
  114. self.inner
  115. .verify_melt_request(melt_request.deref())
  116. .map_err(into_err)
  117. }
  118. /// Process Melt Request
  119. #[wasm_bindgen(js_name = ProcessMeltRequest)]
  120. pub fn process_melt_request(
  121. &mut self,
  122. melt_request: JsMeltRequest,
  123. preimage: String,
  124. total_spent: JsAmount,
  125. ) -> Result<JsMeltResponse> {
  126. Ok(self
  127. .inner
  128. .process_melt_request(melt_request.deref(), &preimage, *total_spent.deref())
  129. .map_err(into_err)?
  130. .into())
  131. }
  132. }