diff --git a/src/hooks/useENSName.ts b/src/hooks/useENSName.ts index 97a140d7ab9..3d4ac2b007e 100644 --- a/src/hooks/useENSName.ts +++ b/src/hooks/useENSName.ts @@ -6,6 +6,7 @@ import { isAddress } from '../utils' import isZero from '../utils/isZero' import { useENSRegistrarContract, useENSResolverContract } from './useContract' import useDebounce from './useDebounce' +import useENSAddress from './useENSAddress' /** * Does a reverse lookup for an address to find its ENS name. @@ -24,14 +25,22 @@ export default function useENSName(address?: string): { ENSName: string | null; resolverAddressResult && !isZero(resolverAddressResult) ? resolverAddressResult : undefined, false ) - const name = useSingleCallResult(resolverContract, 'name', ensNodeArgument) + const nameCallRes = useSingleCallResult(resolverContract, 'name', ensNodeArgument) + const name = nameCallRes.result?.[0] + + /* ENS does not enforce that an address owns a .eth domain before setting it as a reverse proxy + and recommends that you perform a match on the forward resolution + see: https://docs.ens.domains/dapp-developer-guide/resolving-names#reverse-resolution + */ + const fwdAddr = useENSAddress(name) + const checkedName = address === fwdAddr?.address ? name : null const changed = debouncedAddress !== address return useMemo( () => ({ - ENSName: changed ? null : name.result?.[0] ?? null, - loading: changed || resolverAddress.loading || name.loading, + ENSName: changed ? null : checkedName, + loading: changed || resolverAddress.loading || nameCallRes.loading, }), - [changed, name.loading, name.result, resolverAddress.loading] + [changed, nameCallRes.loading, checkedName, resolverAddress.loading] ) }