dash_sdk/platform/transition/
purchase_document.rsuse super::broadcast::BroadcastStateTransition;
use super::waitable::Waitable;
use crate::platform::transition::put_settings::PutSettings;
use crate::{Error, Sdk};
use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters;
use dpp::data_contract::document_type::DocumentType;
use dpp::document::Document;
use dpp::fee::Credits;
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
use dpp::prelude::Identifier;
use dpp::state_transition::documents_batch_transition::methods::v0::DocumentsBatchTransitionMethodsV0;
use dpp::state_transition::documents_batch_transition::DocumentsBatchTransition;
use dpp::state_transition::StateTransition;
#[async_trait::async_trait]
pub trait PurchaseDocument<S: Signer>: Waitable {
async fn purchase_document(
&self,
price: Credits,
sdk: &Sdk,
document_type: DocumentType,
purchaser_id: Identifier,
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<StateTransition, Error>;
async fn purchase_document_and_wait_for_response(
&self,
price: Credits,
sdk: &Sdk,
document_type: DocumentType,
purchaser_id: Identifier,
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<Document, Error>;
}
#[async_trait::async_trait]
impl<S: Signer> PurchaseDocument<S> for Document {
async fn purchase_document(
&self,
price: Credits,
sdk: &Sdk,
document_type: DocumentType,
purchaser_id: Identifier,
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<StateTransition, Error> {
let new_identity_contract_nonce = sdk
.get_identity_contract_nonce(
purchaser_id,
document_type.data_contract_id(),
true,
settings,
)
.await?;
let settings = settings.unwrap_or_default();
let transition = DocumentsBatchTransition::new_document_purchase_transition_from_document(
self.clone(),
document_type.as_ref(),
purchaser_id,
price,
&identity_public_key,
new_identity_contract_nonce,
settings.user_fee_increase.unwrap_or_default(),
signer,
sdk.version(),
None,
None,
None,
)?;
transition.broadcast(sdk, Some(settings)).await?;
Ok(transition)
}
async fn purchase_document_and_wait_for_response(
&self,
price: Credits,
sdk: &Sdk,
document_type: DocumentType,
purchaser_id: Identifier,
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<Document, Error> {
let state_transition = self
.purchase_document(
price,
sdk,
document_type,
purchaser_id,
identity_public_key,
signer,
settings,
)
.await?;
Self::wait_for_response(sdk, state_transition, settings).await
}
}