cashu_mint.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. use lightning_invoice::Invoice;
  2. use url::Url;
  3. use crate::{
  4. error::Error,
  5. types::{
  6. BlindedMessage, CheckFeesRequest, CheckFeesResponse, CheckSpendableRequest,
  7. CheckSpendableResponse, MeltRequest, MeltResposne, MintInfo, MintKeySets, MintKeys,
  8. MintRequest, PostMintResponse, Proof, RequestMintResponse, SplitRequest, SplitResponse,
  9. },
  10. };
  11. pub struct CashuMint {
  12. url: Url,
  13. }
  14. impl CashuMint {
  15. pub fn new(url: Url) -> Self {
  16. Self { url }
  17. }
  18. /// Get Mint Keys [NUT-01]
  19. pub async fn get_keys(&self) -> Result<MintKeys, Error> {
  20. let url = self.url.join("keys")?;
  21. Ok(minreq::get(url).send()?.json::<MintKeys>()?)
  22. }
  23. /// Get Keysets [NUT-02]
  24. pub async fn get_keysets(&self) -> Result<MintKeySets, Error> {
  25. let url = self.url.join("keysets")?;
  26. Ok(minreq::get(url).send()?.json::<MintKeySets>()?)
  27. }
  28. /// Request Mint [NUT-03]
  29. pub async fn request_mint(&self, amount: u64) -> Result<RequestMintResponse, Error> {
  30. let mut url = self.url.join("mint")?;
  31. url.query_pairs_mut()
  32. .append_pair("amount", &amount.to_string());
  33. Ok(minreq::get(url).send()?.json::<RequestMintResponse>()?)
  34. }
  35. /// Mint Tokens [NUT-04]
  36. pub async fn mint(
  37. &self,
  38. blinded_messages: Vec<BlindedMessage>,
  39. payment_hash: &str,
  40. ) -> Result<PostMintResponse, Error> {
  41. let mut url = self.url.join("mint")?;
  42. url.query_pairs_mut()
  43. .append_pair("payment_hash", payment_hash);
  44. let request = MintRequest {
  45. outputs: blinded_messages,
  46. };
  47. Ok(minreq::post(url)
  48. .with_json(&request)?
  49. .send()?
  50. .json::<PostMintResponse>()?)
  51. }
  52. /// Check Max expected fee [NUT-05]
  53. pub async fn check_fees(&self, invoice: Invoice) -> Result<CheckFeesResponse, Error> {
  54. let url = self.url.join("checkfees")?;
  55. let request = CheckFeesRequest { pr: invoice };
  56. Ok(minreq::post(url)
  57. .with_json(&request)?
  58. .send()?
  59. .json::<CheckFeesResponse>()?)
  60. }
  61. /// Melt [NUT-05]
  62. /// [Nut-08] Lightning fee return if outputs defined
  63. pub async fn melt(
  64. &self,
  65. proofs: Vec<Proof>,
  66. invoice: Invoice,
  67. outputs: Option<Vec<BlindedMessage>>,
  68. ) -> Result<MeltResposne, Error> {
  69. let url = self.url.join("melt")?;
  70. let request = MeltRequest {
  71. proofs,
  72. pr: invoice,
  73. outputs,
  74. };
  75. Ok(minreq::post(url)
  76. .with_json(&request)?
  77. .send()?
  78. .json::<MeltResposne>()?)
  79. }
  80. /// Split Token [NUT-06]
  81. pub async fn split(
  82. &self,
  83. amount: u64,
  84. proofs: Vec<Proof>,
  85. outputs: Vec<BlindedMessage>,
  86. ) -> Result<SplitResponse, Error> {
  87. let url = self.url.join("split")?;
  88. let request = SplitRequest {
  89. amount,
  90. proofs,
  91. outputs,
  92. };
  93. Ok(minreq::post(url)
  94. .with_json(&request)?
  95. .send()?
  96. .json::<SplitResponse>()?)
  97. }
  98. /// Spendable check [NUT-07]
  99. pub async fn check_spendable(
  100. &self,
  101. proofs: Vec<Proof>,
  102. ) -> Result<CheckSpendableResponse, Error> {
  103. let url = self.url.join("check")?;
  104. let request = CheckSpendableRequest { proofs };
  105. Ok(minreq::post(url)
  106. .with_json(&request)?
  107. .send()?
  108. .json::<CheckSpendableResponse>()?)
  109. }
  110. /// Get Mint Info [NUT-09]
  111. pub async fn get_info(&self) -> Result<MintInfo, Error> {
  112. let url = self.url.join("info")?;
  113. Ok(minreq::get(url).send()?.json::<MintInfo>()?)
  114. }
  115. }