func NewReverseResolverAt(backend bind.ContractBackend, address common.Address) (*ReverseResolver, error) {
	contract, err := reverseresolver.NewContract(address, backend)
	if err != nil {
		return nil, err
	}
	nameHash, err := NameHash("0.addr.reverse")
	if err != nil {
		return nil, err
	}
	_, err = contract.Name(nil, nameHash)
	if err != nil && err.Error() == "no contract code at given address" {
		return nil, fmt.Errorf("not a resolver")
	}
	return &ReverseResolver{
		Contract:     contract,
		ContractAddr: address,
	}, nil
}
NewReverseResolverAt obtains the reverse resolver at a given address
package ens
import (
	"errors"
	"fmt"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/wealdtech/go-ens/v3/contracts/reverseresolver"
)
type ReverseResolver struct {
	Contract     *reverseresolver.Contract
	ContractAddr common.Address
}
func NewReverseResolverFor(backend bind.ContractBackend, address common.Address) (*ReverseResolver, error) {
	registry, err := NewRegistry(backend)
	if err != nil {
		return nil, err
	}
	domain := fmt.Sprintf("%x.addr.reverse", address.Bytes())
	contractAddress, err := registry.ResolverAddress(domain)
	if err != nil {
		return nil, err
	}
	return NewReverseResolverAt(backend, contractAddress)
}
func NewReverseResolver(backend bind.ContractBackend) (*ReverseResolver, error) {
	reverseRegistrar, err := NewReverseRegistrar(backend)
	if err != nil {
		return nil, err
	}
	address, err := reverseRegistrar.DefaultResolverAddress()
	if err != nil {
		return nil, err
	}
	return NewReverseResolverAt(backend, address)
}