cashu_mint.rs 3.8 KB

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