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