dash_sdk/platform/transition/
unshield.rs

1use 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/// Helper trait to unshield funds from the shielded pool to a platform address.
11#[async_trait::async_trait]
12pub trait UnshieldFunds {
13    /// Unshield funds from the shielded pool to a platform address.
14    /// Authentication is via Orchard spend authorization signatures in the bundle actions.
15    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}