nut08.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use std::ops::Deref;
  2. use cashu::nuts::nut00::{BlindedMessage, BlindedSignature, Proof};
  3. use cashu::nuts::nut08::{MeltRequest, MeltResponse};
  4. use wasm_bindgen::prelude::*;
  5. use crate::error::{into_err, Result};
  6. use crate::types::{JsAmount, JsBolt11Invoice};
  7. #[wasm_bindgen(js_name = MeltRequest)]
  8. pub struct JsMeltRequest {
  9. inner: MeltRequest,
  10. }
  11. impl Deref for JsMeltRequest {
  12. type Target = MeltRequest;
  13. fn deref(&self) -> &Self::Target {
  14. &self.inner
  15. }
  16. }
  17. impl From<MeltRequest> for JsMeltRequest {
  18. fn from(inner: MeltRequest) -> JsMeltRequest {
  19. JsMeltRequest { inner }
  20. }
  21. }
  22. #[wasm_bindgen(js_class = MeltRequest)]
  23. impl JsMeltRequest {
  24. #[wasm_bindgen(constructor)]
  25. pub fn new(
  26. proofs: JsValue,
  27. invoice: JsBolt11Invoice,
  28. outputs: JsValue,
  29. ) -> Result<JsMeltRequest> {
  30. let proofs: Vec<Proof> = serde_wasm_bindgen::from_value(proofs).map_err(into_err)?;
  31. let outputs: Option<Vec<BlindedMessage>> = if !outputs.is_null() {
  32. Some(serde_wasm_bindgen::from_value(outputs).map_err(into_err)?)
  33. } else {
  34. None
  35. };
  36. Ok(JsMeltRequest {
  37. inner: MeltRequest {
  38. proofs,
  39. pr: invoice.deref().clone(),
  40. outputs,
  41. },
  42. })
  43. }
  44. /// Get Proofs
  45. #[wasm_bindgen(getter)]
  46. pub fn proofs(&self) -> Result<JsValue> {
  47. serde_wasm_bindgen::to_value(&self.inner.proofs).map_err(into_err)
  48. }
  49. /// Get Invoice
  50. #[wasm_bindgen(getter)]
  51. pub fn invoice(&self) -> JsBolt11Invoice {
  52. self.inner.pr.clone().into()
  53. }
  54. /// Get outputs
  55. #[wasm_bindgen(getter)]
  56. pub fn outputs(&self) -> Result<JsValue> {
  57. serde_wasm_bindgen::to_value(&self.inner.outputs).map_err(into_err)
  58. }
  59. }
  60. #[wasm_bindgen(js_name = MeltResponse)]
  61. pub struct JsMeltResponse {
  62. inner: MeltResponse,
  63. }
  64. impl Deref for JsMeltResponse {
  65. type Target = MeltResponse;
  66. fn deref(&self) -> &Self::Target {
  67. &self.inner
  68. }
  69. }
  70. impl From<MeltResponse> for JsMeltResponse {
  71. fn from(inner: MeltResponse) -> JsMeltResponse {
  72. JsMeltResponse { inner }
  73. }
  74. }
  75. #[wasm_bindgen(js_class = MeltResponse)]
  76. impl JsMeltResponse {
  77. #[wasm_bindgen(constructor)]
  78. pub fn new(paid: bool, preimage: Option<String>, change: JsValue) -> Result<JsMeltResponse> {
  79. let change: Option<Vec<BlindedSignature>> = if change.is_null() {
  80. Some(serde_wasm_bindgen::from_value(change).map_err(into_err)?)
  81. } else {
  82. None
  83. };
  84. Ok(JsMeltResponse {
  85. inner: MeltResponse {
  86. paid,
  87. preimage,
  88. change,
  89. },
  90. })
  91. }
  92. /// Get Paid
  93. #[wasm_bindgen(getter)]
  94. pub fn paid(&self) -> bool {
  95. self.inner.paid
  96. }
  97. /// Get Preimage
  98. #[wasm_bindgen(getter)]
  99. pub fn preimage(&self) -> Option<String> {
  100. self.inner.preimage.clone()
  101. }
  102. /// Get Change
  103. #[wasm_bindgen(getter)]
  104. pub fn change(&self) -> Result<JsValue> {
  105. serde_wasm_bindgen::to_value(&self.inner.change).map_err(into_err)
  106. }
  107. /// Change Amount
  108. #[wasm_bindgen(js_name = "changeAmount")]
  109. pub fn change_amount(&self) -> JsAmount {
  110. self.inner.change_amount().into()
  111. }
  112. }