|
| 1 | +use ink_core::memory::vec::Vec; |
| 2 | +use ink_utils; |
| 3 | +use parity_codec::Encode; |
| 4 | + |
| 5 | +pub trait EncodeSafe{ |
| 6 | + fn encode_safe(&self) -> Vec<u8>; |
| 7 | +} |
| 8 | + |
| 9 | +macro_rules! impl_encode_safe { |
| 10 | + ($( $one:ty ),*) => { $( |
| 11 | + impl EncodeSafe for $one { |
| 12 | + fn encode_safe(&self) -> Vec<u8> { |
| 13 | + parity_codec::Encode::encode(&self) |
| 14 | + } |
| 15 | + } |
| 16 | + )* } |
| 17 | +} |
| 18 | + |
| 19 | +impl_encode_safe!(bool,u16,u32,u64,u128,i8,i16,i32,i64,i128,Vec<u8>); |
| 20 | + |
| 21 | +/// make selector from method name |
| 22 | +#[allow(unused)] |
| 23 | +fn raw_message_selector(name: &str) -> u32 { |
| 24 | + let keccak = ink_utils::hash::keccak256(name.as_bytes()); |
| 25 | + u32::from_le_bytes([keccak[0], keccak[1], keccak[2], keccak[3]]) |
| 26 | +} |
| 27 | + |
| 28 | +/// encode to input_data from Box wrapped params |
| 29 | +#[allow(unused)] |
| 30 | +pub fn gen_input_data(method: &str, params: &[Box<EncodeSafe>]) -> Vec<u8> |
| 31 | +where |
| 32 | +{ |
| 33 | + let selector = raw_message_selector(method); |
| 34 | + let mut input_data = selector.encode(); |
| 35 | + for param in params.iter() { |
| 36 | + let mut encoded_param = param.encode_safe(); |
| 37 | + input_data.append(&mut encoded_param); |
| 38 | + } |
| 39 | + return input_data.encode() |
| 40 | +} |
| 41 | + |
| 42 | +#[cfg(test)] |
| 43 | +mod tests { |
| 44 | + use super::*; |
| 45 | + |
| 46 | + #[test] |
| 47 | + fn message_selectors() { |
| 48 | + assert_eq!(raw_message_selector("inc"), 257544423); |
| 49 | + assert_eq!(raw_message_selector("get"), 4266279973); |
| 50 | + assert_eq!(raw_message_selector("compare"), 363906316); |
| 51 | + } |
| 52 | + |
| 53 | + #[test] |
| 54 | + fn encode(){ |
| 55 | + let var:bool = false; |
| 56 | + assert_eq!(var.encode(), vec![0]); |
| 57 | + |
| 58 | + let var:bool = true; |
| 59 | + assert_eq!(var.encode(), vec![1]); |
| 60 | + |
| 61 | + let var :u32 = 22; |
| 62 | + assert_eq!(var.encode(), vec![22,0,0,0]); |
| 63 | + |
| 64 | + let var :u32 = 257544423; |
| 65 | + assert_eq!(var.encode(), vec![231, 208, 89, 15]); |
| 66 | + |
| 67 | + let mut vec1 : Vec<u8> = Vec::new(); vec1.push(11); |
| 68 | + assert_eq!(vec1.encode(), vec![4,11]); |
| 69 | + } |
| 70 | + |
| 71 | + #[test] |
| 72 | + fn input_data_works(){ |
| 73 | + let mut params : Vec<Box<EncodeSafe>> = Vec::new(); |
| 74 | + params.push(Box::new(true)); |
| 75 | + params.push(Box::new(12u64)); |
| 76 | + assert_eq!(gen_input_data("inc",¶ms),vec![52, 231, 208, 89, 15, 1, 12, 0, 0, 0, 0, 0, 0, 0]); |
| 77 | + } |
| 78 | +} |
0 commit comments