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