dash_sdk/platform/transition/
put_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, DocumentV0Getters};
use dpp::identity::signer::Signer;
use dpp::identity::IdentityPublicKey;
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 PutDocument<S: Signer>: Waitable {
async fn put_to_platform(
&self,
sdk: &Sdk,
document_type: DocumentType,
document_state_transition_entropy: [u8; 32],
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<StateTransition, Error>;
async fn put_to_platform_and_wait_for_response(
&self,
sdk: &Sdk,
document_type: DocumentType,
document_state_transition_entropy: [u8; 32],
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<Document, Error>;
}
#[async_trait::async_trait]
impl<S: Signer> PutDocument<S> for Document {
async fn put_to_platform(
&self,
sdk: &Sdk,
document_type: DocumentType,
document_state_transition_entropy: [u8; 32],
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<StateTransition, Error> {
let new_identity_contract_nonce = sdk
.get_identity_contract_nonce(
self.owner_id(),
document_type.data_contract_id(),
true,
settings,
)
.await?;
let settings = settings.unwrap_or_default();
let transition = DocumentsBatchTransition::new_document_creation_transition_from_document(
self.clone(),
document_type.as_ref(),
document_state_transition_entropy,
&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 put_to_platform_and_wait_for_response(
&self,
sdk: &Sdk,
document_type: DocumentType,
document_state_transition_entropy: [u8; 32],
identity_public_key: IdentityPublicKey,
signer: &S,
settings: Option<PutSettings>,
) -> Result<Document, Error> {
let state_transition = self
.put_to_platform(
sdk,
document_type,
document_state_transition_entropy,
identity_public_key,
signer,
settings,
)
.await?;
Self::wait_for_response(sdk, state_transition, settings).await
}
}