use alloy_primitives::B256;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
use url::Url;
use x402_types::chain::ChainId;
use x402_types::config::LiteralOrEnv;
use crate::chain::Eip155ChainReference;
#[derive(Debug, Clone)]
pub struct Eip155ChainConfig {
pub chain_reference: Eip155ChainReference,
pub inner: Eip155ChainConfigInner,
}
impl Eip155ChainConfig {
pub fn chain_id(&self) -> ChainId {
self.chain_reference.into()
}
pub fn eip1559(&self) -> bool {
self.inner.eip1559
}
pub fn flashblocks(&self) -> bool {
self.inner.flashblocks
}
pub fn receipt_timeout_secs(&self) -> u64 {
self.inner.receipt_timeout_secs
}
pub fn signers(&self) -> &Eip155SignersConfig {
&self.inner.signers
}
pub fn rpc(&self) -> &Vec<RpcConfig> {
&self.inner.rpc
}
pub fn chain_reference(&self) -> Eip155ChainReference {
self.chain_reference
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Eip155ChainConfigInner {
#[serde(default = "eip155_chain_config::default_eip1559")]
pub eip1559: bool,
#[serde(default = "eip155_chain_config::default_flashblocks")]
pub flashblocks: bool,
pub signers: Eip155SignersConfig,
pub rpc: Vec<RpcConfig>,
#[serde(default = "eip155_chain_config::default_receipt_timeout_secs")]
pub receipt_timeout_secs: u64,
}
mod eip155_chain_config {
pub fn default_eip1559() -> bool {
true
}
pub fn default_flashblocks() -> bool {
false
}
pub fn default_receipt_timeout_secs() -> u64 {
30
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RpcConfig {
pub http: LiteralOrEnv<Url>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub rate_limit: Option<u32>,
}
pub type Eip155SignersConfig = Vec<LiteralOrEnv<EvmPrivateKey>>;
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct EvmPrivateKey(B256);
impl EvmPrivateKey {
pub fn as_bytes(&self) -> &[u8; 32] {
self.0.as_ref()
}
}
impl PartialEq for EvmPrivateKey {
fn eq(&self, other: &Self) -> bool {
self.0 == other.0
}
}
impl FromStr for EvmPrivateKey {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
B256::from_str(s)
.map(Self)
.map_err(|e| format!("Invalid evm private key: {}", e))
}
}