use alloy::{
primitives::{address, keccak256, Address, FixedBytes},
providers::RootProvider,
sol,
transports::http::Http,
};
use reqwest::Client;
use serde::{Deserialize, Serialize};
sol!(
#[derive(Debug, Deserialize, Serialize)]
#[allow(missing_docs)]
#[sol(rpc)]
interface ENSRegistry {
function resolver(bytes32 node) external view returns(address);
}
);
sol!(
#[derive(Debug, Deserialize, Serialize)]
#[allow(missing_docs)]
#[sol(rpc)]
interface ENSName {
function name(bytes32 node) external view returns(string);
}
);
pub async fn get_ens_name(
address: Address,
provider: &RootProvider<Http<Client>>,
) -> Option<String> {
let addr_str = format!(
"{}.addr.reverse",
address.to_string().to_lowercase().trim_start_matches("0x")
);
let mut hash = vec![0u8; 32];
for label in addr_str.rsplit(".") {
hash.append(&mut keccak256(label.as_bytes()).to_vec());
hash = keccak256(hash.as_slice()).to_vec();
}
let ens_registry = ENSRegistry::new(
address!("00000000000C2E074eC69A0dFb2997BA6C7d2e1e"),
&provider,
);
let resolver = ens_registry
.resolver(FixedBytes::from_slice(&hash))
.call()
.await
.unwrap()
._0;
if resolver != Address::ZERO {
let name_contract = ENSName::new(resolver, provider);
let name = name_contract
.name(FixedBytes::from_slice(&hash.as_slice()))
.call()
.await
.unwrap()
._0;
return Some(name);
}
None
}