1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

/// Whether a function modifies or reads blockchain state
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum StateMutability {
	/// Specified not to read blockchain state
	#[cfg_attr(feature = "serde", serde(rename = "pure"))]
	Pure,
	/// Specified to not modify the blockchain state
	#[cfg_attr(feature = "serde", serde(rename = "view"))]
	View,
	/// Function does not accept Ether - the default
	#[cfg_attr(feature = "serde", serde(rename = "nonpayable"))]
	NonPayable,
	/// Function accepts Ether
	#[cfg_attr(feature = "serde", serde(rename = "payable"))]
	Payable,
}

impl Default for StateMutability {
	fn default() -> Self {
		Self::NonPayable
	}
}

#[cfg(all(test, feature = "serde"))]
mod test {
	#[cfg(not(feature = "std"))]
	use crate::no_std_prelude::*;
	use crate::{tests::assert_json_eq, StateMutability};

	#[test]
	fn state_mutability() {
		let json = r#"
			[
				"pure",
				"view",
				"nonpayable",
				"payable"
			]
		"#;

		let deserialized: Vec<StateMutability> = serde_json::from_str(json).unwrap();

		assert_eq!(
			deserialized,
			vec![StateMutability::Pure, StateMutability::View, StateMutability::NonPayable, StateMutability::Payable,]
		);

		assert_json_eq(json, &serde_json::to_string(&deserialized).unwrap());
	}
}