Skip to main content

tronz_primitives/
resource.rs

1//! TRON stakeable resource types.
2
3use serde::{Deserialize, Serialize};
4
5/// The kind of network resource obtained by staking TRX.
6///
7/// Discriminants match the protobuf `ResourceCode` enum so the value can be
8/// used directly when building contract parameters.
9#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
10#[repr(i32)]
11pub enum ResourceCode {
12    /// Network bandwidth (free + staked).
13    Bandwidth = 0,
14    /// Energy, consumed when executing smart contracts.
15    Energy = 1,
16    /// TRON Power, the voting weight obtained from staking.
17    TronPower = 2,
18}
19
20impl ResourceCode {
21    /// The protobuf discriminant for this resource.
22    pub const fn as_i32(self) -> i32 {
23        self as i32
24    }
25
26    /// Convert from a protobuf discriminant, returning `None` if unknown.
27    pub const fn from_i32(value: i32) -> Option<Self> {
28        match value {
29            0 => Some(ResourceCode::Bandwidth),
30            1 => Some(ResourceCode::Energy),
31            2 => Some(ResourceCode::TronPower),
32            _ => None,
33        }
34    }
35}
36
37impl Default for ResourceCode {
38    /// Energy is the most commonly staked-for resource and matches the default
39    /// used by the staking builders.
40    fn default() -> Self {
41        ResourceCode::Energy
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn discriminants() {
51        assert_eq!(ResourceCode::Bandwidth.as_i32(), 0);
52        assert_eq!(ResourceCode::Energy.as_i32(), 1);
53        assert_eq!(ResourceCode::TronPower.as_i32(), 2);
54        assert_eq!(ResourceCode::from_i32(1), Some(ResourceCode::Energy));
55        assert_eq!(ResourceCode::from_i32(9), None);
56        assert_eq!(ResourceCode::default(), ResourceCode::Energy);
57    }
58}