1use crate::std::{Box, Vec};
11
12
13#[derive(Debug, Clone, PartialEq)]
15pub struct Param {
16 pub kind: ParamKind,
18 pub indexed: bool,
20}
21
22#[derive(Debug, Clone, PartialEq)]
24pub enum ParamKind {
25 Address,
27 Bytes,
29 Int(usize),
31 Uint(usize),
33 Bool,
35 String,
37 Array(Box<ParamKind>),
39 FixedBytes(usize),
41 FixedArray(Box<ParamKind>, usize),
43 Tuple(Vec<Box<ParamKind>>),
45}
46
47impl ParamKind {
48 pub fn is_empty_bytes_valid_encoding(&self) -> bool {
51 match self {
52 ParamKind::FixedBytes(len) => *len == 0,
53 ParamKind::FixedArray(_, len) => *len == 0,
54 _ => false,
55 }
56 }
57
58 pub fn is_dynamic(&self) -> bool {
61 match self {
62 ParamKind::Bytes | ParamKind::String | ParamKind::Array(_) => true,
63 ParamKind::FixedArray(elem_type, _) => elem_type.is_dynamic(),
64 ParamKind::Tuple(params) => params.iter().any(|param| param.is_dynamic()),
65 _ => false,
66 }
67 }
68}
69
70#[cfg(test)]
71mod tests {
72 use crate::ParamKind;
73
74 #[test]
75 fn test_is_dynamic() {
76 assert_eq!(ParamKind::Address.is_dynamic(), false);
77 assert_eq!(ParamKind::Bytes.is_dynamic(), true);
78 assert_eq!(ParamKind::FixedBytes(32).is_dynamic(), false);
79 assert_eq!(ParamKind::Uint(256).is_dynamic(), false);
80 assert_eq!(ParamKind::Int(64).is_dynamic(), false);
81 assert_eq!(ParamKind::Bool.is_dynamic(), false);
82 assert_eq!(ParamKind::String.is_dynamic(), true);
83 assert_eq!(ParamKind::Array(Box::new(ParamKind::Bool)).is_dynamic(), true);
84 assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::Uint(256)), 2).is_dynamic(), false);
85 assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::String), 2).is_dynamic(), true);
86 assert_eq!(ParamKind::FixedArray(Box::new(ParamKind::Array(Box::new(ParamKind::Bool))), 2).is_dynamic(), true);
87 }
88}