From 9b7f34f12e105a4228e7435bb68d717835f46e1b Mon Sep 17 00:00:00 2001 From: nuno Date: Thu, 21 Jul 2022 12:13:27 +0200 Subject: [PATCH] Fix and test AddPool encoding --- Cargo.lock | 1 + pallets/connectors/Cargo.toml | 1 + pallets/connectors/src/lib.rs | 5 ++- pallets/connectors/src/message.rs | 52 ++++++++++++++++++++++++------- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3bd72c9281..197d41483a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5953,6 +5953,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "hex", "orml-tokens", "orml-traits", "pallet-balances", diff --git a/pallets/connectors/Cargo.toml b/pallets/connectors/Cargo.toml index f2a8f397c6..5f7b8aad86 100644 --- a/pallets/connectors/Cargo.toml +++ b/pallets/connectors/Cargo.toml @@ -31,6 +31,7 @@ common-types = { path = "../../libs/common-types", default-features = false, opt runtime-common = { path = "../../runtime/common", default-features = false, optional = true } [dev-dependencies] +hex = "0.4.3" # Substrate crates & pallets sp-core = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.24" } sp-io = { git = "https://github.com/paritytech/substrate", default-features = false , branch = "polkadot-v0.9.24" } diff --git a/pallets/connectors/src/lib.rs b/pallets/connectors/src/lib.rs index 304e2bc807..0868fa5a1d 100644 --- a/pallets/connectors/src/lib.rs +++ b/pallets/connectors/src/lib.rs @@ -59,7 +59,10 @@ pub mod pallet { + Copy + HasCompact + MaxEncodedLen - + core::fmt::Debug; + + core::fmt::Debug + + Encode + + Decode + + Into; type TrancheId: Member + Parameter diff --git a/pallets/connectors/src/message.rs b/pallets/connectors/src/message.rs index 49b6617016..0acc9bd8d7 100644 --- a/pallets/connectors/src/message.rs +++ b/pallets/connectors/src/message.rs @@ -2,18 +2,32 @@ use crate::*; #[derive(Decode, Clone, PartialEq, TypeInfo)] #[cfg_attr(feature = "std", derive(Debug))] -pub enum Message { +pub enum Message where PoolId: Encode + Decode { Invalid, AddPool { pool_id: PoolId }, // More to come... } -impl Encode for Message { +impl Message { + fn call_type(&self) -> u8 { + match self { + Self::Invalid => 0, + Self::AddPool { .. } => 1, + } + } +} + +impl Encode for Message { fn encode(&self) -> Vec { match self { - Message::Invalid => vec![0u8], - Message::AddPool { pool_id: _ } => { - let mut message: Vec = vec![0u8]; - message.append(&mut vec![1, 2, 3]); //todo(nuno): &mut pool_id.as_bytes().to_vec()); + Message::Invalid => vec![self.call_type()], + Message::AddPool { pool_id } => { + let mut message: Vec = vec![]; + message.push(self.call_type()); + //todo(nuno): &mut pool_id.as_bytes().to_vec()); + // to do this, we need to need a stricter PoolId bound to be able to convert it to byte array + let mut encoded_pool_id = pool_id.encode(); + encoded_pool_id.reverse(); + message.append(&mut encoded_pool_id); message } } @@ -24,6 +38,7 @@ impl Encode for Message { mod tests { use crate::Message; use codec::Encode; + use hex::FromHex; type PoolId = u64; @@ -32,14 +47,29 @@ mod tests { #[test] fn invalid() { - let encoded = Message::::Invalid.encode(); - assert_eq!(encoded, vec![0]) + let msg = Message::::Invalid; + assert_eq!(msg.encode(), vec![msg.call_type()]); + assert_eq!(msg.encode(), vec![0]); } #[test] - fn add_pool() { - let encoded = Message::::AddPool { pool_id: 42 }.encode(); - assert_eq!(encoded, vec![0, 1, 2, 3]) + fn add_pool_0() { + let msg = Message::::AddPool { pool_id: 0 }; + let encoded = msg.encode(); + + let input = "010000000000000000"; + let expected = <[u8; 9]>::from_hex(input).expect("Decoding failed"); + assert_eq!(encoded, expected); + } + + #[test] + fn add_pool_long() { + let msg = Message::::AddPool { pool_id: 12378532 }; + let encoded = msg.encode(); + + let input = "010000000000bce1a4"; + let expected = <[u8; 9]>::from_hex(input).expect("Decoding failed"); + assert_eq!(encoded, expected); } } }