use crate::{
api::Eth,
contract::{Contract, Options},
signing::NameHash,
types::{Address, TransactionId},
Transport,
};
type ContractError = crate::contract::Error;
const ENS_REGISTRY_ADDRESS: &str = "00000000000C2E074eC69A0dFb2997BA6C7d2e1e";
#[derive(Debug, Clone)]
pub struct Registry<T: Transport> {
contract: Contract<T>,
}
impl<T: Transport> Registry<T> {
pub fn new(eth: Eth<T>) -> Self {
let address = ENS_REGISTRY_ADDRESS.parse().expect("Parsing Address");
let json = include_bytes!("ENSRegistry.json");
let contract = Contract::from_json(eth, address, json).expect("Contract Creation");
Self { contract }
}
}
impl<T: Transport> Registry<T> {
pub async fn owner(&self, node: NameHash) -> Result<Address, ContractError> {
let options = Options::default();
self.contract.query("owner", node, None, options, None).await
}
pub async fn resolver(&self, node: NameHash) -> Result<Address, ContractError> {
let options = Options::default();
self.contract.query("resolver", node, None, options, None).await
}
pub async fn ttl(&self, node: NameHash) -> Result<u64, ContractError> {
let options = Options::default();
self.contract.query("ttl", node, None, options, None).await
}
pub async fn set_owner(
&self,
from: Address,
node: NameHash,
owner: Address,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self.contract.call("setOwner", (node, owner), from, options).await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_resolver(
&self,
from: Address,
node: NameHash,
resolver: Address,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self
.contract
.call("setResolver", (node, resolver), from, options)
.await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_ttl(&self, from: Address, node: NameHash, ttl: u64) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self.contract.call("setTTL", (node, ttl), from, options).await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_subnode_owner(
&self,
from: Address,
node: NameHash,
label: [u8; 32],
owner: Address,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self
.contract
.call("setSubnodeOwner", (node, label, owner), from, options)
.await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_record(
&self,
from: Address,
node: NameHash,
owner: Address,
resolver: Address,
ttl: u64,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self
.contract
.call("setRecord", (node, owner, resolver, ttl), from, options)
.await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_subnode_record(
&self,
from: Address,
node: NameHash,
label: [u8; 32],
owner: Address,
resolver: Address,
ttl: u64,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self
.contract
.call("setSubnodeRecord", (node, label, owner, resolver, ttl), from, options)
.await?;
Ok(TransactionId::Hash(id))
}
pub async fn set_approval_for_all(
&self,
from: Address,
operator: Address,
approved: bool,
) -> Result<TransactionId, ContractError> {
let options = Options::default();
let id = self
.contract
.call("setApprovalForAll", (operator, approved), from, options)
.await?;
Ok(TransactionId::Hash(id))
}
pub async fn check_approval(&self, owner: Address, operator: Address) -> Result<bool, ContractError> {
let options = Options::default();
self.contract
.query("isApprovedForAll", (owner, operator), None, options, None)
.await
}
pub async fn check_record_existence(&self, node: NameHash) -> Result<bool, ContractError> {
let options = Options::default();
self.contract.query("recordExists", node, None, options, None).await
}
}