dash_sdk/platform/transition/
update_price_of_document.rsuse crate::{Error, Sdk};
use super::broadcast::BroadcastStateTransition;
use super::waitable::Waitable;
use crate::platform::transition::put_settings::PutSettings;
use dpp::data_contract::document_type::accessors::DocumentTypeV0Getters;
use dpp::data_contract::document_type::DocumentType;
use dpp::document::{Document, DocumentV0Getters};
use dpp::fee::Credits;
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 UpdatePriceOfDocument<S: Signer>: Waitable {
    async fn update_price_of_document(
        &self,
        price: Credits,
        sdk: &Sdk,
        document_type: DocumentType,
        identity_public_key: IdentityPublicKey,
        signer: &S,
        settings: Option<PutSettings>,
    ) -> Result<StateTransition, Error>;
    async fn update_price_of_document_and_wait_for_response(
        &self,
        price: Credits,
        sdk: &Sdk,
        document_type: DocumentType,
        identity_public_key: IdentityPublicKey,
        signer: &S,
        settings: Option<PutSettings>,
    ) -> Result<Document, Error>;
}
#[async_trait::async_trait]
impl<S: Signer> UpdatePriceOfDocument<S> for Document {
    async fn update_price_of_document(
        &self,
        price: Credits,
        sdk: &Sdk,
        document_type: DocumentType,
        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_update_price_transition_from_document(
                self.clone(),
                document_type.as_ref(),
                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 update_price_of_document_and_wait_for_response(
        &self,
        price: Credits,
        sdk: &Sdk,
        document_type: DocumentType,
        identity_public_key: IdentityPublicKey,
        signer: &S,
        settings: Option<PutSettings>,
    ) -> Result<Document, Error> {
        let state_transition = self
            .update_price_of_document(price, sdk, document_type, identity_public_key, signer, None)
            .await?;
        Self::wait_for_response(sdk, state_transition, settings).await
    }
}