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