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