dash_sdk/platform/transition/
unshield.rs1use super::broadcast::BroadcastStateTransition;
2use super::put_settings::PutSettings;
3use super::validation::ensure_valid_state_transition_structure;
4use crate::{Error, Sdk};
5use dpp::address_funds::PlatformAddress;
6use dpp::shielded::OrchardBundleParams;
7use dpp::state_transition::unshield_transition::methods::UnshieldTransitionMethodsV0;
8use dpp::state_transition::unshield_transition::UnshieldTransition;
9
10#[async_trait::async_trait]
12pub trait UnshieldFunds {
13 async fn unshield_funds(
16 &self,
17 output_address: PlatformAddress,
18 unshielding_amount: u64,
19 bundle: OrchardBundleParams,
20 settings: Option<PutSettings>,
21 ) -> Result<(), Error>;
22}
23
24#[async_trait::async_trait]
25impl UnshieldFunds for Sdk {
26 async fn unshield_funds(
27 &self,
28 output_address: PlatformAddress,
29 unshielding_amount: u64,
30 bundle: OrchardBundleParams,
31 settings: Option<PutSettings>,
32 ) -> Result<(), Error> {
33 let OrchardBundleParams {
34 actions,
35 anchor,
36 proof,
37 binding_signature,
38 } = bundle;
39
40 let state_transition = UnshieldTransition::try_from_bundle(
41 output_address,
42 actions,
43 unshielding_amount,
44 anchor,
45 proof,
46 binding_signature,
47 self.version(),
48 )?;
49 ensure_valid_state_transition_structure(&state_transition, self.version())?;
50
51 state_transition.broadcast(self, settings).await?;
52 Ok(())
53 }
54}