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