Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enforce commutativity of ENS reverse resolution #996

Merged
merged 1 commit into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@
- Add a getter to `ProjectCompileOutput` that returns a mapping of compiler
versions to a vector of name + contract struct tuples
[#908](https://github.com/gakonst/ethers-rs/pull/908)
- Enforce commutativity of ENS reverse resolution
[#996](https://github.com/gakonst/ethers-rs/pull/996)

## ethers-contract-abigen

Expand Down
13 changes: 12 additions & 1 deletion ethers-providers/src/provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ pub enum ProviderError {
#[error("ens name not found: {0}")]
EnsError(String),

/// Invalid reverse ENS name
#[error("reverse ens name not pointing to itself: {0}")]
EnsNotOwned(String),

#[error(transparent)]
SerdeJson(#[from] serde_json::Error),

Expand Down Expand Up @@ -794,7 +798,14 @@ impl<P: JsonRpcClient> Middleware for Provider<P> {
/// a string. This should theoretically never happen.
async fn lookup_address(&self, address: Address) -> Result<String, ProviderError> {
let ens_name = ens::reverse_address(address);
self.query_resolver(ParamType::String, &ens_name, ens::NAME_SELECTOR).await
let domain: String =
self.query_resolver(ParamType::String, &ens_name, ens::NAME_SELECTOR).await?;
let reverse_address = self.resolve_name(&domain).await?;
if address != reverse_address {
Err(ProviderError::EnsNotOwned(domain))
} else {
Ok(domain)
}
}

/// Returns the avatar HTTP link of the avatar that the `ens_name` resolves to (or None
Expand Down