use alloy::primitives::Address;
#[derive(Debug, thiserror::Error)]
pub enum Erc8004Error {
#[error("contract error: {0}")]
Contract(#[from] alloy::contract::Error),
#[error("transport error: {0}")]
Transport(#[from] alloy::transports::RpcError<alloy::transports::TransportErrorKind>),
#[error("registry not configured: {registry}")]
RegistryNotConfigured {
registry: &'static str,
},
#[error("agent {agent_id} does not exist")]
AgentNotFound {
agent_id: alloy::primitives::U256,
},
#[error("pending transaction error: {0}")]
PendingTransaction(#[from] alloy::providers::PendingTransactionError),
#[error("json error: {0}")]
Json(#[from] serde_json::Error),
#[error("invalid address: {address}")]
InvalidAddress {
address: String,
#[source]
source: alloy::hex::FromHexError,
},
#[error("transaction receipt contained no Registered event")]
MissingRegisteredEvent,
#[error("identity registry mismatch: expected {expected}, got {actual}")]
IdentityRegistryMismatch {
expected: Address,
actual: Address,
},
}
pub type Result<T> = core::result::Result<T, Erc8004Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_registry_not_configured_display() {
let err = Erc8004Error::RegistryNotConfigured {
registry: "identity",
};
assert_eq!(err.to_string(), "registry not configured: identity");
}
#[test]
fn test_agent_not_found_display() {
let err = Erc8004Error::AgentNotFound {
agent_id: alloy::primitives::U256::from(42),
};
assert_eq!(err.to_string(), "agent 42 does not exist");
}
#[test]
fn test_missing_registered_event_display() {
let err = Erc8004Error::MissingRegisteredEvent;
assert_eq!(
err.to_string(),
"transaction receipt contained no Registered event"
);
}
#[test]
fn test_identity_registry_mismatch_display() {
let expected = Address::ZERO;
let actual = Address::repeat_byte(0x01);
let err = Erc8004Error::IdentityRegistryMismatch { expected, actual };
assert_eq!(
err.to_string(),
format!("identity registry mismatch: expected {expected}, got {actual}")
);
}
#[test]
fn test_error_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Erc8004Error>();
}
}