use alloy_primitives::Address;
use crate::{
erc7930::InteropAddress,
error::{Ensip25Error, Result},
};
pub fn record_key(registry: &InteropAddress, agent_id: &str) -> Result<String> {
validate_agent_id(agent_id)?;
Ok(format!(
"agent-registration[{}][{agent_id}]",
registry.to_hex()?
))
}
pub fn evm_record_key(chain_id: u64, registry: Address, agent_id: u64) -> Result<String> {
let ia = InteropAddress::evm(chain_id, registry);
let id_str = agent_id.to_string();
record_key(&ia, &id_str)
}
fn validate_agent_id(agent_id: &str) -> Result<()> {
if agent_id.contains('[') || agent_id.contains(']') {
return Err(Ensip25Error::InvalidAgentId {
agent_id: agent_id.to_owned(),
});
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ensip25_spec_example() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let key = evm_record_key(1, registry, 167).expect("valid key");
assert_eq!(
key,
"agent-registration[0x000100000101148004a169fb4a3325136eb29fa0ceb6d2e539a432][167]"
);
}
#[test]
fn blog_example_agent_42() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let key = evm_record_key(1, registry, 42).expect("valid key");
assert_eq!(
key,
"agent-registration[0x000100000101148004a169fb4a3325136eb29fa0ceb6d2e539a432][42]"
);
}
#[test]
fn invalid_agent_id_brackets() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let ia = InteropAddress::evm(1, registry);
assert!(record_key(&ia, "foo[bar]").is_err());
}
#[test]
fn invalid_agent_id_open_bracket() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let ia = InteropAddress::evm(1, registry);
assert!(record_key(&ia, "foo[").is_err());
}
#[test]
fn invalid_agent_id_close_bracket() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let ia = InteropAddress::evm(1, registry);
assert!(record_key(&ia, "]bar").is_err());
}
#[test]
fn empty_agent_id_is_valid() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let ia = InteropAddress::evm(1, registry);
let key = record_key(&ia, "").expect("valid key");
assert!(key.ends_with("[]"));
}
#[test]
fn generic_record_key() {
let registry: Address = "0x8004A169FB4a3325136EB29fA0ceB6D2e539a432"
.parse()
.expect("valid");
let ia = InteropAddress::evm(1, registry);
let key = record_key(&ia, "42").expect("valid key");
assert!(key.starts_with("agent-registration[0x"));
assert!(key.ends_with("][42]"));
}
}