dash_sdk/platform/tokens/transitions/
transfer.rs

1//! Token transfer operations for the Dash Platform SDK.
2//!
3//! This module provides functionality to transfer tokens between identities
4//! on the Dash Platform.
5
6use crate::platform::tokens::builders::transfer::TokenTransferTransitionBuilder;
7use crate::platform::transition::broadcast::BroadcastStateTransition;
8use crate::{Error, Sdk};
9use dpp::balances::credits::TokenAmount;
10use dpp::data_contract::group::GroupSumPower;
11use dpp::document::Document;
12use dpp::identity::signer::Signer;
13use dpp::identity::IdentityPublicKey;
14use dpp::platform_value::Identifier;
15use dpp::state_transition::proof_result::StateTransitionProofResult;
16use std::collections::BTreeMap;
17
18/// Result types returned from token transfer operations.
19///
20/// This enum represents the different possible outcomes when transferring tokens,
21/// depending on the token configuration and whether it's a group action.
22pub enum TransferResult {
23    /// Standard transfer result containing updated balances for affected identities.
24    IdentitiesBalances(BTreeMap<Identifier, TokenAmount>),
25    /// Transfer result with historical tracking via document storage.
26    HistoricalDocument(Document),
27    /// Group-based transfer action with optional document for history.
28    GroupActionWithDocument(GroupSumPower, Option<Document>),
29}
30
31impl Sdk {
32    /// Transfers tokens from one identity to another.
33    ///
34    /// This method broadcasts a transfer transition to move tokens between identities.
35    /// The result varies based on token configuration:
36    /// - Standard tokens return updated balances for the affected identities
37    /// - Tokens with history tracking return documents
38    /// - Group-managed tokens include group power information
39    ///
40    /// # Arguments
41    ///
42    /// * `transfer_tokens_transition_builder` - Builder containing transfer parameters including recipient and amount
43    /// * `signing_key` - The identity public key for signing the transition
44    /// * `signer` - Implementation of the Signer trait for cryptographic signing
45    ///
46    /// # Returns
47    ///
48    /// Returns a `Result` containing a `TransferResult` on success, or an `Error` on failure.
49    ///
50    /// # Errors
51    ///
52    /// This function will return an error if:
53    /// - The transition signing fails
54    /// - Broadcasting the transition fails
55    /// - The proof verification returns an unexpected result type
56    pub async fn token_transfer<S: Signer<IdentityPublicKey>>(
57        &self,
58        transfer_tokens_transition_builder: TokenTransferTransitionBuilder,
59        signing_key: &IdentityPublicKey,
60        signer: &S,
61    ) -> Result<TransferResult, Error> {
62        let platform_version = self.version();
63
64        let put_settings = transfer_tokens_transition_builder.settings;
65
66        let state_transition = transfer_tokens_transition_builder
67            .sign(self, signing_key, signer, platform_version)
68            .await?;
69
70        let proof_result = state_transition
71            .broadcast_and_wait::<StateTransitionProofResult>(self, put_settings)
72            .await?;
73
74        match proof_result {
75            StateTransitionProofResult::VerifiedTokenIdentitiesBalances(balances) => {
76                Ok(TransferResult::IdentitiesBalances(balances))
77            }
78            StateTransitionProofResult::VerifiedTokenActionWithDocument(doc) => {
79                Ok(TransferResult::HistoricalDocument(doc))
80            }
81            StateTransitionProofResult::VerifiedTokenGroupActionWithDocument(power, doc) => {
82                Ok(TransferResult::GroupActionWithDocument(power, doc))
83            }
84            _ => Err(Error::DriveProofError(
85                drive::error::proof::ProofError::UnexpectedResultProof(
86                    "Expected VerifiedTokenIdentitiesBalances, VerifiedTokenActionWithDocument, or VerifiedTokenGroupActionWithDocument for transfer transition".to_string(),
87                ),
88                vec![],
89                Default::default(),
90            )),
91        }
92    }
93}