use std::str::FromStr;
use tracing::instrument;
use crate::nuts::{Proofs, Token};
use crate::{ensure_cdk, Amount, Error, Wallet};
pub(crate) mod saga;
pub use cdk_common::wallet::ReceiveOptions;
use saga::ReceiveSaga;
impl Wallet {
#[instrument(skip_all)]
pub async fn receive_proofs(
&self,
proofs: Proofs,
opts: ReceiveOptions,
memo: Option<String>,
token: Option<String>,
) -> Result<Amount, Error> {
let saga = ReceiveSaga::new(self);
let saga = saga.prepare(proofs, opts, memo, token).await?;
let saga = saga.execute().await?;
Ok(saga.into_amount())
}
#[instrument(skip_all)]
pub async fn receive(
&self,
encoded_token: &str,
opts: ReceiveOptions,
) -> Result<Amount, Error> {
let token = Token::from_str(encoded_token)?;
let unit = token.unit().unwrap_or_default();
ensure_cdk!(unit == self.unit, Error::UnsupportedUnit);
let keysets_info = self.load_mint_keysets().await?;
let proofs = token.proofs(&keysets_info)?;
if let Token::TokenV3(token) = &token {
ensure_cdk!(!token.is_multi_mint(), Error::MultiMintTokenNotSupported);
}
ensure_cdk!(self.mint_url == token.mint_url()?, Error::IncorrectMint);
let amount = self
.receive_proofs(
proofs,
opts,
token.memo().clone(),
Some(encoded_token.to_string()),
)
.await?;
Ok(amount)
}
#[instrument(skip_all)]
pub async fn receive_raw(
&self,
binary_token: &Vec<u8>,
opts: ReceiveOptions,
) -> Result<Amount, Error> {
let token_str = Token::try_from(binary_token)?.to_string();
self.receive(token_str.as_str(), opts).await
}
}