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