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