casper_storage/data_access_layer/
balance_identifier_purse.rs

1use crate::{data_access_layer::BalanceIdentifier, tracking_copy::TrackingCopyError};
2use casper_types::{Digest, ProtocolVersion, URefAddr};
3
4/// Represents a balance identifier purse request.
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub struct BalanceIdentifierPurseRequest {
7    state_hash: Digest,
8    protocol_version: ProtocolVersion,
9    identifier: BalanceIdentifier,
10}
11
12impl BalanceIdentifierPurseRequest {
13    /// Creates a new [`BalanceIdentifierPurseRequest`].
14    pub fn new(
15        state_hash: Digest,
16        protocol_version: ProtocolVersion,
17        identifier: BalanceIdentifier,
18    ) -> Self {
19        BalanceIdentifierPurseRequest {
20            state_hash,
21            protocol_version,
22            identifier,
23        }
24    }
25
26    /// Returns a state hash.
27    pub fn state_hash(&self) -> Digest {
28        self.state_hash
29    }
30
31    /// Protocol version.
32    pub fn protocol_version(&self) -> ProtocolVersion {
33        self.protocol_version
34    }
35
36    /// Returns the identifier [`BalanceIdentifier`].
37    pub fn identifier(&self) -> &BalanceIdentifier {
38        &self.identifier
39    }
40}
41
42/// Result enum that represents all possible outcomes of a balance request.
43#[derive(Debug, Clone)]
44pub enum BalanceIdentifierPurseResult {
45    /// Returned if a passed state root hash is not found.
46    RootNotFound,
47    /// A query returned a balance.
48    Success {
49        /// The purse address.
50        purse_addr: URefAddr,
51    },
52    /// Failure.
53    Failure(TrackingCopyError),
54}
55
56impl BalanceIdentifierPurseResult {
57    /// Returns the purse address for a [`BalanceIdentifierPurseResult::Success`] variant.
58    pub fn purse_addr(&self) -> Option<URefAddr> {
59        match self {
60            BalanceIdentifierPurseResult::Success { purse_addr, .. } => Some(*purse_addr),
61            _ => None,
62        }
63    }
64
65    /// Was the balance request successful?
66    pub fn is_success(&self) -> bool {
67        match self {
68            BalanceIdentifierPurseResult::RootNotFound
69            | BalanceIdentifierPurseResult::Failure(_) => false,
70            BalanceIdentifierPurseResult::Success { .. } => true,
71        }
72    }
73
74    /// Tracking copy error, if any.
75    pub fn error(&self) -> Option<&TrackingCopyError> {
76        match self {
77            BalanceIdentifierPurseResult::RootNotFound
78            | BalanceIdentifierPurseResult::Success { .. } => None,
79            BalanceIdentifierPurseResult::Failure(err) => Some(err),
80        }
81    }
82}
83
84impl From<TrackingCopyError> for BalanceIdentifierPurseResult {
85    fn from(tce: TrackingCopyError) -> Self {
86        BalanceIdentifierPurseResult::Failure(tce)
87    }
88}