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.62.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    0.61.0,
105    0.62.0,
106];
107
108#[rustfmt::skip]
109pub const CHECK_AFTER_UPGRADE_TO: &[FrameworkVersion] = framework_versions![
110    0.28.0,
111    0.29.0,
112    0.30.0,
113    0.31.0,
114    0.32.0,
115    0.33.0,
116    0.34.0,
117    0.35.0,
118    0.36.0,
119    0.37.0,
120    0.40.0,
121    0.41.0,
122    0.42.0,
123    0.43.0,
124    0.44.0,
125    0.45.2,
126    0.46.0,
127    0.47.0,
128    0.49.0,
129    0.50.6,
130    0.51.1,
131    0.52.3,
132    0.53.2,
133    0.54.6,
134    0.55.0,
135    0.56.1,
136    0.57.1,
137    0.58.0,
138    0.59.1,
139    0.61.0,
140    0.62.0,
141];
142
143pub const LOWER_VERSION_WITH_TEMPLATE_TAG: FrameworkVersion = framework_version!(0.43.0);
144pub const LOWER_VERSION_WITH_AUTOGENERATED_JSON: FrameworkVersion = framework_version!(0.44.0);
145pub const LOWER_VERSION_WITH_AUTOGENERATED_WASM: FrameworkVersion = framework_version!(0.45.0);
146
147pub fn parse_known_version(tag_str: &str) -> FrameworkVersion {
148    let tag: FrameworkVersion = FrameworkVersion::from_string_template(tag_str);
149    if VERSIONS.contains(&tag) {
150        tag
151    } else {
152        panic!("Version unknown")
153    }
154}
155
156/// We started supporting contract templates with version 0.43.0.
157pub fn validate_template_tag(tag_str: &str) -> bool {
158    let tag: FrameworkVersion = parse_known_version(tag_str);
159
160    tag >= LOWER_VERSION_WITH_TEMPLATE_TAG
161}
162
163pub fn is_template_with_autogenerated_wasm(tag: FrameworkVersion) -> bool {
164    tag >= LOWER_VERSION_WITH_AUTOGENERATED_WASM
165}
166
167pub fn is_template_with_autogenerated_json(tag: FrameworkVersion) -> bool {
168    tag >= LOWER_VERSION_WITH_AUTOGENERATED_JSON
169}
170
171pub fn find_version_by_str(tag: &str) -> Option<&FrameworkVersion> {
172    VERSIONS.iter().find(|&v| v.to_string() == tag)
173}
174
175pub struct VersionIterator {
176    next_version: usize,
177    last_version: FrameworkVersion,
178}
179
180impl VersionIterator {
181    fn is_last_version(&self, version: &FrameworkVersion) -> bool {
182        self.last_version == *version
183    }
184}
185
186impl Iterator for VersionIterator {
187    type Item = (&'static FrameworkVersion, &'static FrameworkVersion);
188
189    fn next(&mut self) -> Option<Self::Item> {
190        if self.next_version > 0 && self.next_version < VERSIONS.len() {
191            let from_version = &VERSIONS[self.next_version - 1];
192
193            if self.is_last_version(from_version) {
194                None
195            } else {
196                let to_version = &VERSIONS[self.next_version];
197                let result = (from_version, to_version);
198                self.next_version += 1;
199                Some(result)
200            }
201        } else {
202            None
203        }
204    }
205}
206
207pub fn versions_iter(last_version: FrameworkVersion) -> VersionIterator {
208    VersionIterator {
209        next_version: 1,
210        last_version,
211    }
212}
213
214#[cfg(test)]
215pub mod tests {
216
217    use crate::version::is_sorted;
218
219    use super::*;
220
221    #[test]
222    fn compare_versions_test() {
223        let f1: FrameworkVersion = framework_version!(0.44.0);
224        let f2: FrameworkVersion = framework_version!(0.41.2);
225
226        assert!(f1 > f2);
227    }
228
229    #[test]
230    fn framework_version_display_test() {
231        assert_eq!(format!("Framework: {}", VERSIONS[0]), "Framework: 0.28.0");
232    }
233
234    #[test]
235    fn template_versions_test() {
236        assert!(validate_template_tag("0.43.0"));
237        assert!(!validate_template_tag("0.42.0"));
238    }
239
240    #[test]
241    fn template_versions_with_autogenerated_wasm_test() {
242        assert!(is_template_with_autogenerated_wasm(framework_version!(
243            0.45.0
244        )));
245        assert!(!is_template_with_autogenerated_wasm(framework_version!(
246            0.44.0
247        )));
248    }
249
250    #[test]
251    fn template_versions_with_autogenerated_json_test() {
252        assert!(is_template_with_autogenerated_json(framework_version!(
253            0.44.0
254        )));
255        assert!(!is_template_with_autogenerated_json(framework_version!(
256            0.43.0
257        )));
258    }
259
260    #[test]
261    fn find_version_by_str_test() {
262        let version = find_version_by_str("0.28.0");
263        match version {
264            Some(v) => assert_eq!(VERSIONS[0], *v),
265            None => unreachable!(),
266        }
267    }
268
269    #[test]
270    fn framework_version_test() {
271        assert!(is_sorted(VERSIONS));
272    }
273}