multiversx_sc_meta_lib/
version_history.rs

1use crate::{framework_version, framework_versions, version::FrameworkVersion};
2
3/// The last version to be used for upgrades and templates.
4///
5/// Should be edited every time a new version of the framework is released.
6pub const LAST_VERSION: FrameworkVersion = framework_version!(0.60.0);
7
8/// Indicates where to stop with the upgrades.
9pub const LAST_UPGRADE_VERSION: FrameworkVersion = LAST_VERSION;
10
11pub const LAST_TEMPLATE_VERSION: FrameworkVersion = LAST_VERSION;
12
13#[rustfmt::skip]
14/// Known versions for the upgrader.
15pub const VERSIONS: &[FrameworkVersion] = framework_versions![
16    0.28.0, 
17    0.29.0, 
18    0.29.2, 
19    0.29.3, 
20    0.30.0, 
21    0.31.0, 
22    0.31.1, 
23    0.32.0, 
24    0.33.0, 
25    0.33.1, 
26    0.34.0, 
27    0.34.1,
28    0.35.0, 
29    0.36.0, 
30    0.36.1, 
31    0.37.0, 
32    0.38.0, 
33    0.39.0, 
34    0.39.1, 
35    0.39.2, 
36    0.39.3, 
37    0.39.4, 
38    0.39.5, 
39    0.39.6,
40    0.39.7, 
41    0.39.8, 
42    0.40.0, 
43    0.40.1, 
44    0.41.0, 
45    0.41.1, 
46    0.41.2, 
47    0.41.3, 
48    0.42.0, 
49    0.43.0, 
50    0.43.1, 
51    0.43.2,
52    0.43.3, 
53    0.43.4, 
54    0.43.5, 
55    0.44.0, 
56    0.45.0, 
57    0.45.2,
58    0.46.0,
59    0.46.1,
60    0.47.0,
61    0.47.1,
62    0.47.2,
63    0.47.3,
64    0.47.4,
65    0.47.5,
66    0.47.6,
67    0.47.7,
68    0.47.8,
69    0.48.0,
70    0.48.1,
71    0.49.0,
72    0.50.0,
73    0.50.1,
74    0.50.2,
75    0.50.3,
76    0.50.4,
77    0.50.5,
78    0.50.6,
79    0.51.0,
80    0.51.1,
81    0.52.0,
82    0.52.1,
83    0.52.2,
84    0.52.3,
85    0.53.0,
86    0.53.1,
87    0.53.2,
88    0.54.0,
89    0.54.1,
90    0.54.2,
91    0.54.3,
92    0.54.4,
93    0.54.5,
94    0.54.6,
95    0.55.0,
96    0.56.0,
97    0.56.1,
98    0.57.0,
99    0.57.1,
100    0.58.0,
101    0.59.0,
102    0.59.1,
103    0.60.0,
104];
105
106#[rustfmt::skip]
107pub const CHECK_AFTER_UPGRADE_TO: &[FrameworkVersion] = framework_versions![
108    0.28.0,
109    0.29.0,
110    0.30.0,
111    0.31.0,
112    0.32.0,
113    0.33.0,
114    0.34.0,
115    0.35.0,
116    0.36.0,
117    0.37.0,
118    0.40.0,
119    0.41.0,
120    0.42.0,
121    0.43.0,
122    0.44.0,
123    0.45.2,
124    0.46.0,
125    0.47.0,
126    0.49.0,
127    0.50.6,
128    0.51.1,
129    0.52.3,
130    0.53.2,
131    0.54.6,
132    0.55.0,
133    0.56.1,
134    0.57.1,
135    0.58.0,
136    0.59.1,
137    0.60.0,
138];
139
140pub const LOWER_VERSION_WITH_TEMPLATE_TAG: FrameworkVersion = framework_version!(0.43.0);
141pub const LOWER_VERSION_WITH_AUTOGENERATED_JSON: FrameworkVersion = framework_version!(0.44.0);
142pub const LOWER_VERSION_WITH_AUTOGENERATED_WASM: FrameworkVersion = framework_version!(0.45.0);
143
144pub fn parse_known_version(tag_str: &str) -> FrameworkVersion {
145    let tag: FrameworkVersion = FrameworkVersion::from_string_template(tag_str);
146    if VERSIONS.contains(&tag) {
147        tag
148    } else {
149        panic!("Version unknown")
150    }
151}
152
153/// We started supporting contract templates with version 0.43.0.
154pub fn validate_template_tag(tag_str: &str) -> bool {
155    let tag: FrameworkVersion = parse_known_version(tag_str);
156
157    tag >= LOWER_VERSION_WITH_TEMPLATE_TAG
158}
159
160pub fn is_template_with_autogenerated_wasm(tag: FrameworkVersion) -> bool {
161    tag >= LOWER_VERSION_WITH_AUTOGENERATED_WASM
162}
163
164pub fn is_template_with_autogenerated_json(tag: FrameworkVersion) -> bool {
165    tag >= LOWER_VERSION_WITH_AUTOGENERATED_JSON
166}
167
168pub fn find_version_by_str(tag: &str) -> Option<&FrameworkVersion> {
169    VERSIONS.iter().find(|&v| v.to_string() == tag)
170}
171
172pub struct VersionIterator {
173    next_version: usize,
174    last_version: FrameworkVersion,
175}
176
177impl VersionIterator {
178    fn is_last_version(&self, version: &FrameworkVersion) -> bool {
179        self.last_version == *version
180    }
181}
182
183impl Iterator for VersionIterator {
184    type Item = (&'static FrameworkVersion, &'static FrameworkVersion);
185
186    fn next(&mut self) -> Option<Self::Item> {
187        if self.next_version > 0 && self.next_version < VERSIONS.len() {
188            let from_version = &VERSIONS[self.next_version - 1];
189
190            if self.is_last_version(from_version) {
191                None
192            } else {
193                let to_version = &VERSIONS[self.next_version];
194                let result = (from_version, to_version);
195                self.next_version += 1;
196                Some(result)
197            }
198        } else {
199            None
200        }
201    }
202}
203
204pub fn versions_iter(last_version: FrameworkVersion) -> VersionIterator {
205    VersionIterator {
206        next_version: 1,
207        last_version,
208    }
209}
210
211#[cfg(test)]
212pub mod tests {
213
214    use crate::version::is_sorted;
215
216    use super::*;
217
218    #[test]
219    fn compare_versions_test() {
220        let f1: FrameworkVersion = framework_version!(0.44.0);
221        let f2: FrameworkVersion = framework_version!(0.41.2);
222
223        assert!(f1 > f2);
224    }
225
226    #[test]
227    fn framework_version_display_test() {
228        assert_eq!(format!("Framework: {}", VERSIONS[0]), "Framework: 0.28.0");
229    }
230
231    #[test]
232    fn template_versions_test() {
233        assert!(validate_template_tag("0.43.0"));
234        assert!(!validate_template_tag("0.42.0"));
235    }
236
237    #[test]
238    fn template_versions_with_autogenerated_wasm_test() {
239        assert!(is_template_with_autogenerated_wasm(framework_version!(
240            0.45.0
241        )));
242        assert!(!is_template_with_autogenerated_wasm(framework_version!(
243            0.44.0
244        )));
245    }
246
247    #[test]
248    fn template_versions_with_autogenerated_json_test() {
249        assert!(is_template_with_autogenerated_json(framework_version!(
250            0.44.0
251        )));
252        assert!(!is_template_with_autogenerated_json(framework_version!(
253            0.43.0
254        )));
255    }
256
257    #[test]
258    fn find_version_by_str_test() {
259        let version = find_version_by_str("0.28.0");
260        match version {
261            Some(v) => assert_eq!(VERSIONS[0], *v),
262            None => unreachable!(),
263        }
264    }
265
266    #[test]
267    fn framework_version_test() {
268        assert!(is_sorted(VERSIONS));
269    }
270}