use cfx_types::{Address, U256};
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))]
pub struct Authorization {
pub chain_id: U256,
pub address: Address,
#[cfg_attr(feature = "serde", serde(with = "quantity"))]
pub nonce: u64,
}
#[derive(Debug, Clone, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SignedAuthorization {
#[cfg_attr(feature = "serde", serde(flatten))]
inner: Authorization,
#[cfg_attr(
feature = "serde",
serde(rename = "yParity", alias = "v", with = "quantity")
)]
y_parity: u64,
r: U256,
s: U256,
}
impl SignedAuthorization {
pub const fn strip_signature(self) -> Authorization { self.inner }
pub const fn inner(&self) -> &Authorization { &self.inner }
pub fn y_parity(&self) -> u8 { self.y_parity as u8 }
pub const fn r(&self) -> U256 { self.r }
pub const fn s(&self) -> U256 { self.s }
}
#[cfg(feature = "serde")]
mod quantity {
use cfx_types::U64;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub(crate) fn serialize<S>(
value: &u64, serializer: S,
) -> Result<S::Ok, S::Error>
where S: Serializer {
U64::from(*value).serialize(serializer)
}
pub(crate) fn deserialize<'de, D>(
deserializer: D,
) -> Result<u64, D::Error>
where D: Deserializer<'de> {
U64::deserialize(deserializer).map(|value| value.as_u64())
}
}