forked from ghostchain/ghost-node
		
	separate evm structs, deserialisation functions and main logic
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									591cce1fb1
								
							
						
					
					
						commit
						47f7ae3847
					
				@ -1,6 +1,6 @@
 | 
				
			|||||||
[package]
 | 
					[package]
 | 
				
			||||||
name = "ghost-slow-clap"
 | 
					name = "ghost-slow-clap"
 | 
				
			||||||
version = "0.3.32"
 | 
					version = "0.3.33"
 | 
				
			||||||
description = "Applause protocol for the EVM bridge"
 | 
					description = "Applause protocol for the EVM bridge"
 | 
				
			||||||
license.workspace = true
 | 
					license.workspace = true
 | 
				
			||||||
authors.workspace = true
 | 
					authors.workspace = true
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										57
									
								
								pallets/slow-clap/src/deserialisations.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								pallets/slow-clap/src/deserialisations.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					use crate::{Deserialize, Deserializer, Vec, H256};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn de_string_to_bytes<'de, D>(de: D) -> Result<Option<Vec<u8>>, D::Error>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    D: Deserializer<'de>,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let s: &str = Deserialize::deserialize(de)?;
 | 
				
			||||||
 | 
					    Ok(Some(s.as_bytes().to_vec()))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn de_string_to_u64<'de, D>(de: D) -> Result<Option<u64>, D::Error>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    D: Deserializer<'de>,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let s: &str = Deserialize::deserialize(de)?;
 | 
				
			||||||
 | 
					    let s = if s.starts_with("0x") { &s[2..] } else { &s };
 | 
				
			||||||
 | 
					    Ok(u64::from_str_radix(s, 16).ok())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn de_string_to_u64_pure<'de, D>(de: D) -> Result<u64, D::Error>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    D: Deserializer<'de>,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let s: &str = Deserialize::deserialize(de)?;
 | 
				
			||||||
 | 
					    let s = if s.starts_with("0x") { &s[2..] } else { &s };
 | 
				
			||||||
 | 
					    Ok(u64::from_str_radix(s, 16).unwrap_or_default())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn de_string_to_h256<'de, D>(de: D) -> Result<Option<H256>, D::Error>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    D: Deserializer<'de>,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let s: &str = Deserialize::deserialize(de)?;
 | 
				
			||||||
 | 
					    let start_index = if s.starts_with("0x") { 2 } else { 0 };
 | 
				
			||||||
 | 
					    let h256: Vec<_> = (start_index..s.len())
 | 
				
			||||||
 | 
					        .step_by(2)
 | 
				
			||||||
 | 
					        .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed"))
 | 
				
			||||||
 | 
					        .collect();
 | 
				
			||||||
 | 
					    Ok(Some(H256::from_slice(&h256)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn de_string_to_vec_of_bytes<'de, D>(de: D) -> Result<Vec<Vec<u8>>, D::Error>
 | 
				
			||||||
 | 
					where
 | 
				
			||||||
 | 
					    D: Deserializer<'de>,
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    let strings: Vec<&str> = Deserialize::deserialize(de)?;
 | 
				
			||||||
 | 
					    Ok(strings
 | 
				
			||||||
 | 
					        .iter()
 | 
				
			||||||
 | 
					        .map(|s| {
 | 
				
			||||||
 | 
					            let start_index = if s.starts_with("0x") { 2 } else { 0 };
 | 
				
			||||||
 | 
					            (start_index..s.len())
 | 
				
			||||||
 | 
					                .step_by(2)
 | 
				
			||||||
 | 
					                .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed"))
 | 
				
			||||||
 | 
					                .collect::<Vec<u8>>()
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .collect::<Vec<Vec<u8>>>())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										49
									
								
								pallets/slow-clap/src/evm_types.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								pallets/slow-clap/src/evm_types.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
				
			|||||||
 | 
					use crate::{
 | 
				
			||||||
 | 
					    deserialisations::{
 | 
				
			||||||
 | 
					        de_string_to_bytes, de_string_to_h256, de_string_to_u64, de_string_to_u64_pure,
 | 
				
			||||||
 | 
					        de_string_to_vec_of_bytes,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    Decode, Deserialize, Encode, RuntimeDebug, Vec, H256,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const NUMBER_OF_TOPICS: usize = 3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)]
 | 
				
			||||||
 | 
					pub struct EvmResponse {
 | 
				
			||||||
 | 
					    #[serde(default)]
 | 
				
			||||||
 | 
					    id: Option<u32>,
 | 
				
			||||||
 | 
					    #[serde(default, deserialize_with = "de_string_to_bytes")]
 | 
				
			||||||
 | 
					    jsonrpc: Option<Vec<u8>>,
 | 
				
			||||||
 | 
					    #[serde(default, deserialize_with = "de_string_to_bytes")]
 | 
				
			||||||
 | 
					    pub error: Option<Vec<u8>>,
 | 
				
			||||||
 | 
					    #[serde(default)]
 | 
				
			||||||
 | 
					    pub result: Option<EvmResponseType>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)]
 | 
				
			||||||
 | 
					#[serde(untagged)]
 | 
				
			||||||
 | 
					pub enum EvmResponseType {
 | 
				
			||||||
 | 
					    #[serde(deserialize_with = "de_string_to_u64_pure")]
 | 
				
			||||||
 | 
					    BlockNumber(u64),
 | 
				
			||||||
 | 
					    TransactionLogs(Vec<Log>),
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(RuntimeDebug, Clone, Eq, PartialEq, Ord, PartialOrd, Deserialize, Encode, Decode)]
 | 
				
			||||||
 | 
					#[serde(rename_all = "camelCase")]
 | 
				
			||||||
 | 
					pub struct Log {
 | 
				
			||||||
 | 
					    #[serde(default, deserialize_with = "de_string_to_h256")]
 | 
				
			||||||
 | 
					    pub transaction_hash: Option<H256>,
 | 
				
			||||||
 | 
					    #[serde(default, deserialize_with = "de_string_to_u64")]
 | 
				
			||||||
 | 
					    pub block_number: Option<u64>,
 | 
				
			||||||
 | 
					    #[serde(default, deserialize_with = "de_string_to_vec_of_bytes")]
 | 
				
			||||||
 | 
					    pub topics: Vec<Vec<u8>>,
 | 
				
			||||||
 | 
					    pub removed: bool,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Log {
 | 
				
			||||||
 | 
					    pub fn is_sufficient(&self) -> bool {
 | 
				
			||||||
 | 
					        self.transaction_hash.is_some()
 | 
				
			||||||
 | 
					            && self.block_number.is_some()
 | 
				
			||||||
 | 
					            && self.topics.len() == NUMBER_OF_TOPICS
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -48,6 +48,11 @@ mod benchmarking;
 | 
				
			|||||||
mod mock;
 | 
					mod mock;
 | 
				
			||||||
mod tests;
 | 
					mod tests;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mod deserialisations;
 | 
				
			||||||
 | 
					mod evm_types;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use evm_types::{EvmResponse, EvmResponseType};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub mod sr25519 {
 | 
					pub mod sr25519 {
 | 
				
			||||||
    mod app_sr25519 {
 | 
					    mod app_sr25519 {
 | 
				
			||||||
        use sp_application_crypto::{app_crypto, sr25519, KeyTypeId};
 | 
					        use sp_application_crypto::{app_crypto, sr25519, KeyTypeId};
 | 
				
			||||||
@ -68,126 +73,9 @@ const DB_PREFIX: &[u8] = b"slow_clap::";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const FETCH_TIMEOUT_PERIOD: u64 = 3_000;
 | 
					const FETCH_TIMEOUT_PERIOD: u64 = 3_000;
 | 
				
			||||||
const LOCK_BLOCK_EXPIRATION: u64 = 10;
 | 
					const LOCK_BLOCK_EXPIRATION: u64 = 10;
 | 
				
			||||||
const NUMBER_OF_TOPICS: usize = 3;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub type AuthIndex = u32;
 | 
					pub type AuthIndex = u32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)]
 | 
					 | 
				
			||||||
struct EvmResponse {
 | 
					 | 
				
			||||||
    #[serde(default)]
 | 
					 | 
				
			||||||
    id: Option<u32>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_bytes")]
 | 
					 | 
				
			||||||
    jsonrpc: Option<Vec<u8>>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_bytes")]
 | 
					 | 
				
			||||||
    error: Option<Vec<u8>>,
 | 
					 | 
				
			||||||
    #[serde(default)]
 | 
					 | 
				
			||||||
    result: Option<EvmResponseType>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(RuntimeDebug, Clone, PartialEq, Deserialize, Encode, Decode)]
 | 
					 | 
				
			||||||
#[serde(untagged)]
 | 
					 | 
				
			||||||
enum EvmResponseType {
 | 
					 | 
				
			||||||
    #[serde(deserialize_with = "de_string_to_u64_pure")]
 | 
					 | 
				
			||||||
    BlockNumber(u64),
 | 
					 | 
				
			||||||
    TransactionLogs(Vec<Log>),
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(RuntimeDebug, Clone, Eq, PartialEq, Ord, PartialOrd, Deserialize, Encode, Decode)]
 | 
					 | 
				
			||||||
#[serde(rename_all = "camelCase")]
 | 
					 | 
				
			||||||
struct Log {
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_h256")]
 | 
					 | 
				
			||||||
    transaction_hash: Option<H256>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_u64")]
 | 
					 | 
				
			||||||
    block_number: Option<u64>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_vec_of_bytes")]
 | 
					 | 
				
			||||||
    topics: Vec<Vec<u8>>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_bytes")]
 | 
					 | 
				
			||||||
    address: Option<Vec<u8>>,
 | 
					 | 
				
			||||||
    #[serde(default, deserialize_with = "de_string_to_btree_map")]
 | 
					 | 
				
			||||||
    data: BTreeMap<u128, u128>,
 | 
					 | 
				
			||||||
    removed: bool,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
impl Log {
 | 
					 | 
				
			||||||
    fn is_sufficient(&self) -> bool {
 | 
					 | 
				
			||||||
        self.transaction_hash.is_some()
 | 
					 | 
				
			||||||
            && self.block_number.is_some()
 | 
					 | 
				
			||||||
            && self.topics.len() == NUMBER_OF_TOPICS
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_bytes<'de, D>(de: D) -> Result<Option<Vec<u8>>, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let s: &str = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    Ok(Some(s.as_bytes().to_vec()))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_u64<'de, D>(de: D) -> Result<Option<u64>, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let s: &str = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    let s = if s.starts_with("0x") { &s[2..] } else { &s };
 | 
					 | 
				
			||||||
    Ok(u64::from_str_radix(s, 16).ok())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_u64_pure<'de, D>(de: D) -> Result<u64, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let s: &str = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    let s = if s.starts_with("0x") { &s[2..] } else { &s };
 | 
					 | 
				
			||||||
    Ok(u64::from_str_radix(s, 16).unwrap_or_default())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_h256<'de, D>(de: D) -> Result<Option<H256>, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let s: &str = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    let start_index = if s.starts_with("0x") { 2 } else { 0 };
 | 
					 | 
				
			||||||
    let h256: Vec<_> = (start_index..s.len())
 | 
					 | 
				
			||||||
        .step_by(2)
 | 
					 | 
				
			||||||
        .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed"))
 | 
					 | 
				
			||||||
        .collect();
 | 
					 | 
				
			||||||
    Ok(Some(H256::from_slice(&h256)))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_vec_of_bytes<'de, D>(de: D) -> Result<Vec<Vec<u8>>, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let strings: Vec<&str> = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    Ok(strings
 | 
					 | 
				
			||||||
        .iter()
 | 
					 | 
				
			||||||
        .map(|s| {
 | 
					 | 
				
			||||||
            let start_index = if s.starts_with("0x") { 2 } else { 0 };
 | 
					 | 
				
			||||||
            (start_index..s.len())
 | 
					 | 
				
			||||||
                .step_by(2)
 | 
					 | 
				
			||||||
                .map(|i| u8::from_str_radix(&s[i..i + 2], 16).expect("valid u8 symbol; qed"))
 | 
					 | 
				
			||||||
                .collect::<Vec<u8>>()
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
        .collect::<Vec<Vec<u8>>>())
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pub fn de_string_to_btree_map<'de, D>(de: D) -> Result<BTreeMap<u128, u128>, D::Error>
 | 
					 | 
				
			||||||
where
 | 
					 | 
				
			||||||
    D: Deserializer<'de>,
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    let s: &str = Deserialize::deserialize(de)?;
 | 
					 | 
				
			||||||
    let start_index = if s.starts_with("0x") { 2 } else { 0 };
 | 
					 | 
				
			||||||
    Ok(BTreeMap::from_iter((start_index..s.len()).step_by(64).map(
 | 
					 | 
				
			||||||
        |i| {
 | 
					 | 
				
			||||||
            (
 | 
					 | 
				
			||||||
                u128::from_str_radix(&s[i..i + 32], 16).expect("valid u8 symbol; qed"),
 | 
					 | 
				
			||||||
                u128::from_str_radix(&s[i + 32..i + 64], 16).expect("valid u8 symbol; qed"),
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
    )))
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[derive(
 | 
					#[derive(
 | 
				
			||||||
    RuntimeDebug, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo, MaxEncodedLen,
 | 
					    RuntimeDebug, Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, TypeInfo, MaxEncodedLen,
 | 
				
			||||||
)]
 | 
					)]
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user