|
@@ -1,5 +1,8 @@
|
|
|
//! Wallet client
|
|
|
|
|
|
+use std::fmt::Debug;
|
|
|
+
|
|
|
+use async_trait::async_trait;
|
|
|
use reqwest::Client;
|
|
|
use serde_json::Value;
|
|
|
use tracing::instrument;
|
|
@@ -8,15 +11,12 @@ use url::Url;
|
|
|
use super::Error;
|
|
|
use crate::error::ErrorResponse;
|
|
|
use crate::mint_url::MintUrl;
|
|
|
-use crate::nuts::nut15::Mpp;
|
|
|
use crate::nuts::{
|
|
|
- BlindedMessage, CheckStateRequest, CheckStateResponse, CurrencyUnit, Id, KeySet, KeysResponse,
|
|
|
- KeysetResponse, MeltBolt11Request, MeltQuoteBolt11Request, MeltQuoteBolt11Response,
|
|
|
- MintBolt11Request, MintBolt11Response, MintInfo, MintQuoteBolt11Request,
|
|
|
- MintQuoteBolt11Response, PreMintSecrets, Proof, PublicKey, RestoreRequest, RestoreResponse,
|
|
|
- SwapRequest, SwapResponse,
|
|
|
+ CheckStateRequest, CheckStateResponse, Id, KeySet, KeysResponse, KeysetResponse,
|
|
|
+ MeltBolt11Request, MeltQuoteBolt11Request, MeltQuoteBolt11Response, MintBolt11Request,
|
|
|
+ MintBolt11Response, MintInfo, MintQuoteBolt11Request, MintQuoteBolt11Response, RestoreRequest,
|
|
|
+ RestoreResponse, SwapRequest, SwapResponse,
|
|
|
};
|
|
|
-use crate::{Amount, Bolt11Invoice};
|
|
|
|
|
|
/// Http Client
|
|
|
#[derive(Debug, Clone)]
|
|
@@ -67,10 +67,14 @@ impl HttpClient {
|
|
|
|
|
|
Ok(Self { inner: client })
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
+#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
|
|
+#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
|
|
+impl HttpClientMethods for HttpClient {
|
|
|
/// Get Active Mint Keys [NUT-01]
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_mint_keys(&self, mint_url: MintUrl) -> Result<Vec<KeySet>, Error> {
|
|
|
+ async fn get_mint_keys(&self, mint_url: MintUrl) -> Result<Vec<KeySet>, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "keys"])?;
|
|
|
let keys = self.inner.get(url).send().await?.json::<Value>().await?;
|
|
|
|
|
@@ -82,7 +86,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Get Keyset Keys [NUT-01]
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_mint_keyset(&self, mint_url: MintUrl, keyset_id: Id) -> Result<KeySet, Error> {
|
|
|
+ async fn get_mint_keyset(&self, mint_url: MintUrl, keyset_id: Id) -> Result<KeySet, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "keys", &keyset_id.to_string()])?;
|
|
|
let keys = self.inner.get(url).send().await?.json::<Value>().await?;
|
|
|
|
|
@@ -94,7 +98,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Get Keysets [NUT-02]
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_mint_keysets(&self, mint_url: MintUrl) -> Result<KeysetResponse, Error> {
|
|
|
+ async fn get_mint_keysets(&self, mint_url: MintUrl) -> Result<KeysetResponse, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "keysets"])?;
|
|
|
let res = self.inner.get(url).send().await?.json::<Value>().await?;
|
|
|
|
|
@@ -106,21 +110,13 @@ impl HttpClient {
|
|
|
|
|
|
/// Mint Quote [NUT-04]
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_mint_quote(
|
|
|
+ async fn post_mint_quote(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
- amount: Amount,
|
|
|
- unit: CurrencyUnit,
|
|
|
- description: Option<String>,
|
|
|
+ request: MintQuoteBolt11Request,
|
|
|
) -> Result<MintQuoteBolt11Response, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "mint", "quote", "bolt11"])?;
|
|
|
|
|
|
- let request = MintQuoteBolt11Request {
|
|
|
- amount,
|
|
|
- unit,
|
|
|
- description,
|
|
|
- };
|
|
|
-
|
|
|
let res = self
|
|
|
.inner
|
|
|
.post(url)
|
|
@@ -141,7 +137,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Mint Quote status
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_mint_quote_status(
|
|
|
+ async fn get_mint_quote_status(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
quote_id: &str,
|
|
@@ -160,20 +156,14 @@ impl HttpClient {
|
|
|
}
|
|
|
|
|
|
/// Mint Tokens [NUT-04]
|
|
|
- #[instrument(skip(self, quote, premint_secrets), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_mint(
|
|
|
+ #[instrument(skip(self, request), fields(mint_url = %mint_url))]
|
|
|
+ async fn post_mint(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
- quote: &str,
|
|
|
- premint_secrets: PreMintSecrets,
|
|
|
+ request: MintBolt11Request,
|
|
|
) -> Result<MintBolt11Response, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "mint", "bolt11"])?;
|
|
|
|
|
|
- let request = MintBolt11Request {
|
|
|
- quote: quote.to_string(),
|
|
|
- outputs: premint_secrets.blinded_messages(),
|
|
|
- };
|
|
|
-
|
|
|
let res = self
|
|
|
.inner
|
|
|
.post(url)
|
|
@@ -191,23 +181,13 @@ impl HttpClient {
|
|
|
|
|
|
/// Melt Quote [NUT-05]
|
|
|
#[instrument(skip(self, request), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_melt_quote(
|
|
|
+ async fn post_melt_quote(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
- unit: CurrencyUnit,
|
|
|
- request: Bolt11Invoice,
|
|
|
- mpp_amount: Option<Amount>,
|
|
|
+ request: MeltQuoteBolt11Request,
|
|
|
) -> Result<MeltQuoteBolt11Response, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "melt", "quote", "bolt11"])?;
|
|
|
|
|
|
- let options = mpp_amount.map(|amount| Mpp { amount });
|
|
|
-
|
|
|
- let request = MeltQuoteBolt11Request {
|
|
|
- request,
|
|
|
- unit,
|
|
|
- options,
|
|
|
- };
|
|
|
-
|
|
|
let res = self
|
|
|
.inner
|
|
|
.post(url)
|
|
@@ -225,7 +205,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Melt Quote Status
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_melt_quote_status(
|
|
|
+ async fn get_melt_quote_status(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
quote_id: &str,
|
|
@@ -242,22 +222,14 @@ impl HttpClient {
|
|
|
|
|
|
/// Melt [NUT-05]
|
|
|
/// [Nut-08] Lightning fee return if outputs defined
|
|
|
- #[instrument(skip(self, quote, inputs, outputs), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_melt(
|
|
|
+ #[instrument(skip(self, request), fields(mint_url = %mint_url))]
|
|
|
+ async fn post_melt(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
- quote: String,
|
|
|
- inputs: Vec<Proof>,
|
|
|
- outputs: Option<Vec<BlindedMessage>>,
|
|
|
+ request: MeltBolt11Request,
|
|
|
) -> Result<MeltQuoteBolt11Response, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "melt", "bolt11"])?;
|
|
|
|
|
|
- let request = MeltBolt11Request {
|
|
|
- quote,
|
|
|
- inputs,
|
|
|
- outputs,
|
|
|
- };
|
|
|
-
|
|
|
let res = self
|
|
|
.inner
|
|
|
.post(url)
|
|
@@ -278,9 +250,9 @@ impl HttpClient {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /// Split Token [NUT-06]
|
|
|
+ /// Swap Token [NUT-03]
|
|
|
#[instrument(skip(self, swap_request), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_swap(
|
|
|
+ async fn post_swap(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
swap_request: SwapRequest,
|
|
@@ -304,7 +276,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Get Mint Info [NUT-06]
|
|
|
#[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn get_mint_info(&self, mint_url: MintUrl) -> Result<MintInfo, Error> {
|
|
|
+ async fn get_mint_info(&self, mint_url: MintUrl) -> Result<MintInfo, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "info"])?;
|
|
|
|
|
|
let res = self.inner.get(url).send().await?.json::<Value>().await?;
|
|
@@ -319,14 +291,13 @@ impl HttpClient {
|
|
|
}
|
|
|
|
|
|
/// Spendable check [NUT-07]
|
|
|
- #[instrument(skip(self), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_check_state(
|
|
|
+ #[instrument(skip(self, request), fields(mint_url = %mint_url))]
|
|
|
+ async fn post_check_state(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
- ys: Vec<PublicKey>,
|
|
|
+ request: CheckStateRequest,
|
|
|
) -> Result<CheckStateResponse, Error> {
|
|
|
let url = mint_url.join_paths(&["v1", "checkstate"])?;
|
|
|
- let request = CheckStateRequest { ys };
|
|
|
|
|
|
let res = self
|
|
|
.inner
|
|
@@ -345,7 +316,7 @@ impl HttpClient {
|
|
|
|
|
|
/// Restore request [NUT-13]
|
|
|
#[instrument(skip(self, request), fields(mint_url = %mint_url))]
|
|
|
- pub async fn post_restore(
|
|
|
+ async fn post_restore(
|
|
|
&self,
|
|
|
mint_url: MintUrl,
|
|
|
request: RestoreRequest,
|
|
@@ -367,3 +338,84 @@ impl HttpClient {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+/// Http Client Methods
|
|
|
+#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
|
|
|
+#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
|
|
|
+pub trait HttpClientMethods: Debug {
|
|
|
+ /// Get Active Mint Keys [NUT-01]
|
|
|
+ async fn get_mint_keys(&self, mint_url: MintUrl) -> Result<Vec<KeySet>, Error>;
|
|
|
+
|
|
|
+ /// Get Keyset Keys [NUT-01]
|
|
|
+ async fn get_mint_keyset(&self, mint_url: MintUrl, keyset_id: Id) -> Result<KeySet, Error>;
|
|
|
+
|
|
|
+ /// Get Keysets [NUT-02]
|
|
|
+ async fn get_mint_keysets(&self, mint_url: MintUrl) -> Result<KeysetResponse, Error>;
|
|
|
+
|
|
|
+ /// Mint Quote [NUT-04]
|
|
|
+ async fn post_mint_quote(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: MintQuoteBolt11Request,
|
|
|
+ ) -> Result<MintQuoteBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Mint Quote status
|
|
|
+ async fn get_mint_quote_status(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ quote_id: &str,
|
|
|
+ ) -> Result<MintQuoteBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Mint Tokens [NUT-04]
|
|
|
+ async fn post_mint(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: MintBolt11Request,
|
|
|
+ ) -> Result<MintBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Melt Quote [NUT-05]
|
|
|
+ async fn post_melt_quote(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: MeltQuoteBolt11Request,
|
|
|
+ ) -> Result<MeltQuoteBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Melt Quote Status
|
|
|
+ async fn get_melt_quote_status(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ quote_id: &str,
|
|
|
+ ) -> Result<MeltQuoteBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Melt [NUT-05]
|
|
|
+ /// [Nut-08] Lightning fee return if outputs defined
|
|
|
+ async fn post_melt(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: MeltBolt11Request,
|
|
|
+ ) -> Result<MeltQuoteBolt11Response, Error>;
|
|
|
+
|
|
|
+ /// Split Token [NUT-06]
|
|
|
+ async fn post_swap(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: SwapRequest,
|
|
|
+ ) -> Result<SwapResponse, Error>;
|
|
|
+
|
|
|
+ /// Get Mint Info [NUT-06]
|
|
|
+ async fn get_mint_info(&self, mint_url: MintUrl) -> Result<MintInfo, Error>;
|
|
|
+
|
|
|
+ /// Spendable check [NUT-07]
|
|
|
+ async fn post_check_state(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: CheckStateRequest,
|
|
|
+ ) -> Result<CheckStateResponse, Error>;
|
|
|
+
|
|
|
+ /// Restore request [NUT-13]
|
|
|
+ async fn post_restore(
|
|
|
+ &self,
|
|
|
+ mint_url: MintUrl,
|
|
|
+ request: RestoreRequest,
|
|
|
+ ) -> Result<RestoreResponse, Error>;
|
|
|
+}
|