revm_specification/eip7702/
authorization_list.rsuse super::RecoveredAuthorization;
use crate::eip7702::SignedAuthorization;
pub use alloy_primitives::{Parity, Signature};
use core::fmt;
use std::{boxed::Box, vec::Vec};
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum AuthorizationList {
Signed(Vec<SignedAuthorization>),
Recovered(Vec<RecoveredAuthorization>),
}
impl Default for AuthorizationList {
fn default() -> Self {
Self::Signed(Vec::new())
}
}
impl From<Vec<SignedAuthorization>> for AuthorizationList {
fn from(signed: Vec<SignedAuthorization>) -> Self {
Self::Signed(signed)
}
}
impl From<Vec<RecoveredAuthorization>> for AuthorizationList {
fn from(recovered: Vec<RecoveredAuthorization>) -> Self {
Self::Recovered(recovered)
}
}
impl AuthorizationList {
pub fn len(&self) -> usize {
match self {
Self::Signed(signed) => signed.len(),
Self::Recovered(recovered) => recovered.len(),
}
}
pub fn empty() -> Self {
Self::Recovered(Vec::new())
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn recovered_iter<'a>(&'a self) -> Box<dyn Iterator<Item = RecoveredAuthorization> + 'a> {
match self {
Self::Signed(signed) => Box::new(signed.iter().map(|signed| signed.clone().into())),
Self::Recovered(recovered) => Box::new(recovered.clone().into_iter()),
}
}
pub fn into_recovered(self) -> Self {
let Self::Signed(signed) = self else {
return self;
};
Self::Recovered(signed.into_iter().map(|signed| signed.into()).collect())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum InvalidAuthorization {
InvalidChainId,
InvalidYParity,
Eip2InvalidSValue,
}
impl fmt::Display for InvalidAuthorization {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
Self::InvalidChainId => "Invalid chain_id, Expect chain's ID or zero",
Self::InvalidYParity => "Invalid y_parity, Expect 0 or 1.",
Self::Eip2InvalidSValue => "Invalid signature s-value.",
};
f.write_str(s)
}
}