radix_engine/vm/
versions.rs

1use radix_common::ScryptoSbor;
2
3#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd)]
4#[repr(u8)]
5pub enum ScryptoVmVersion {
6    V1_0,
7    V1_1,
8    V1_2,
9}
10
11impl ScryptoVmVersion {
12    pub const fn latest() -> ScryptoVmVersion {
13        Self::cuttlefish()
14    }
15
16    pub const fn babylon_genesis() -> ScryptoVmVersion {
17        Self::V1_0
18    }
19
20    pub const fn anemone() -> ScryptoVmVersion {
21        Self::V1_1
22    }
23
24    pub const fn cuttlefish() -> ScryptoVmVersion {
25        Self::V1_2
26    }
27
28    pub const fn crypto_utils_v1() -> ScryptoVmVersion {
29        Self::V1_1
30    }
31
32    pub const fn crypto_utils_v2() -> ScryptoVmVersion {
33        Self::V1_2
34    }
35}
36
37impl From<ScryptoVmVersion> for u64 {
38    fn from(version: ScryptoVmVersion) -> Self {
39        version as u64
40    }
41}
42
43impl TryFrom<u64> for ScryptoVmVersion {
44    type Error = ScryptoVmVersionError;
45
46    fn try_from(version: u64) -> Result<Self, Self::Error> {
47        match version {
48            0 => Ok(Self::V1_0),
49            1 => Ok(Self::V1_1),
50            2 => Ok(Self::V1_2),
51            v => Err(Self::Error::FromIntError(v)),
52        }
53    }
54}
55
56#[derive(Debug, Clone, Eq, PartialEq, ScryptoSbor)]
57pub enum ScryptoVmVersionError {
58    FromIntError(u64),
59}
60
61#[cfg(test)]
62mod test {
63    use super::*;
64
65    #[test]
66    fn test_scrypto_vm_version() {
67        let v = ScryptoVmVersion::latest();
68        assert_eq!(v, ScryptoVmVersion::V1_2);
69        assert_eq!(ScryptoVmVersion::crypto_utils_v1(), ScryptoVmVersion::V1_1);
70    }
71
72    #[test]
73    fn test_scrypto_vm_version_conversions() {
74        let v: u64 = ScryptoVmVersion::V1_1.into();
75        assert_eq!(v, 1);
76
77        let v: ScryptoVmVersion = 1u64.try_into().unwrap();
78        assert_eq!(v, ScryptoVmVersion::V1_1);
79
80        let e = ScryptoVmVersion::try_from(3u64).unwrap_err();
81
82        assert_eq!(e, ScryptoVmVersionError::FromIntError(3u64));
83    }
84
85    #[test]
86    fn test_scrypto_vm_version_ordering() {
87        assert!(ScryptoVmVersion::crypto_utils_v1() == ScryptoVmVersion::V1_1);
88        assert!(ScryptoVmVersion::crypto_utils_v1() > ScryptoVmVersion::V1_0);
89        assert!(ScryptoVmVersion::crypto_utils_v1() < ScryptoVmVersion::crypto_utils_v2());
90    }
91}