From 322870a343e7acc1373aae1353734912510fed46 Mon Sep 17 00:00:00 2001 From: Santiago Gonzalez Date: Mon, 30 Jan 2023 22:18:45 -0500 Subject: [PATCH] use reverse resolution to fetch main ENS name from address --- .../src/components/MemberProfileAvatar.tsx | 2 +- .../src/components/ProposalCardOverview.tsx | 4 +-- apps/admin/src/pages/Member.tsx | 4 +-- apps/admin/src/utils/cacheProfile.ts | 6 ++-- libs/connect-context/src/ConnectContext.tsx | 5 +-- .../src/utils/contextHelpers.ts | 4 ++- libs/profile-data/src/profile.ts | 36 ++++++++++++++++--- libs/profile-data/src/types/ens.types.ts | 6 ++-- 8 files changed, 50 insertions(+), 17 deletions(-) diff --git a/apps/admin/src/components/MemberProfileAvatar.tsx b/apps/admin/src/components/MemberProfileAvatar.tsx index dd105921..02f17a3d 100644 --- a/apps/admin/src/components/MemberProfileAvatar.tsx +++ b/apps/admin/src/components/MemberProfileAvatar.tsx @@ -30,7 +30,7 @@ export const MemberProfileAvatar = ({ const fetchMemberProfile = useCallback( async (address: string, setter: typeof setMemberProfile) => { - const profile = await fetchProfile(address); + const profile = await fetchProfile(address, daochain); setter(profile); }, [] diff --git a/apps/admin/src/components/ProposalCardOverview.tsx b/apps/admin/src/components/ProposalCardOverview.tsx index f04e4ec1..e0af54be 100644 --- a/apps/admin/src/components/ProposalCardOverview.tsx +++ b/apps/admin/src/components/ProposalCardOverview.tsx @@ -7,7 +7,7 @@ import { charLimit, formatShortDateTimeFromSeconds, } from '@daohaus/utils'; -import { Keychain } from '@daohaus/keychain-utils'; +import { Keychain, ValidNetwork } from '@daohaus/keychain-utils'; import { MolochV3Proposal } from '@daohaus/moloch-v3-data'; import { @@ -80,7 +80,7 @@ export const ProposalCardOverview = ({ const fetchMemberProfile = useCallback( async (address: string, setter: typeof setSubmitterProfile) => { - const profile = await fetchProfile(address); + const profile = await fetchProfile(address, daochain as ValidNetwork); setter(profile); }, [] diff --git a/apps/admin/src/pages/Member.tsx b/apps/admin/src/pages/Member.tsx index 7bbbc64b..a445c8f5 100644 --- a/apps/admin/src/pages/Member.tsx +++ b/apps/admin/src/pages/Member.tsx @@ -33,7 +33,7 @@ import { AccountProfile, } from '@daohaus/utils'; -import { Keychain } from '@daohaus/keychain-utils'; +import { Keychain, ValidNetwork } from '@daohaus/keychain-utils'; import { ButtonRouterLink } from '../components/ButtonRouterLink'; import { DaoTable } from '../components/DaohausTable'; @@ -126,7 +126,7 @@ export function Member() { const fetchMemberProfile = useCallback( async (address: string, loadState: typeof setCurrentMemberLoading) => { loadState(true); - const profile = await fetchProfile(address); + const profile = await fetchProfile(address, daochain as ValidNetwork); setCurrentProfile(profile); loadState(false); }, diff --git a/apps/admin/src/utils/cacheProfile.ts b/apps/admin/src/utils/cacheProfile.ts index 0c445263..10ed9dee 100644 --- a/apps/admin/src/utils/cacheProfile.ts +++ b/apps/admin/src/utils/cacheProfile.ts @@ -7,6 +7,7 @@ import { getlocalForage, } from '@daohaus/utils'; import { getProfileForAddress } from '@daohaus/profile-data'; +import { ValidNetwork } from '@daohaus/keychain-utils'; export const getProfileStore = async () => (await getlocalForage(CacheStoreName.MEMBERS_PROFILE)) as ArbitraryState; @@ -60,11 +61,12 @@ export const cacheProfile = async ({ }; export const fetchProfile = async ( - address: string + address: string, + chainId: ValidNetwork ): Promise => { const cachedProfile = await getCachedProfile({ address }); if (cachedProfile) return cachedProfile; - const profile = await getProfileForAddress(address); + const profile = await getProfileForAddress(address, chainId); cacheProfile({ address, profile, diff --git a/libs/connect-context/src/ConnectContext.tsx b/libs/connect-context/src/ConnectContext.tsx index 754795ec..09441f8e 100644 --- a/libs/connect-context/src/ConnectContext.tsx +++ b/libs/connect-context/src/ConnectContext.tsx @@ -105,9 +105,10 @@ export const ConnectProvider = ({ useEffect(() => { let shouldUpdate = true; - if (address && isConnected && address !== profile?.address) { + if (address && chainId && isConnected && address !== profile?.address) { loadProfile({ address, + chainId, setProfile, setProfileLoading, shouldUpdate, @@ -118,7 +119,7 @@ export const ConnectProvider = ({ return () => { shouldUpdate = false; }; - }, [address, isConnected, networks, lifeCycleFns, profile]); + }, [address, chainId, isConnected, networks, lifeCycleFns, profile]); const connectWallet = useCallback(async () => { handleConnectWallet({ diff --git a/libs/connect-context/src/utils/contextHelpers.ts b/libs/connect-context/src/utils/contextHelpers.ts index 788018d2..07e12e6f 100644 --- a/libs/connect-context/src/utils/contextHelpers.ts +++ b/libs/connect-context/src/utils/contextHelpers.ts @@ -135,12 +135,14 @@ export const loadWallet = async ({ export const loadProfile = async ({ address, + chainId, setProfile, setProfileLoading, shouldUpdate, lifeCycleFns, }: { address: string; + chainId: ValidNetwork; setProfile: Dispatch>; setProfileLoading: Dispatch>; shouldUpdate: boolean; @@ -149,7 +151,7 @@ export const loadProfile = async ({ }) => { try { setProfileLoading(true); - const profile = await getProfileForAddress(address); + const profile = await getProfileForAddress(address, chainId); if (profile && shouldUpdate) { const displayName = diff --git a/libs/profile-data/src/profile.ts b/libs/profile-data/src/profile.ts index b9ac17ff..5210ba40 100644 --- a/libs/profile-data/src/profile.ts +++ b/libs/profile-data/src/profile.ts @@ -1,4 +1,6 @@ +import { providers } from 'ethers'; import { graphFetchList } from '@daohaus/data-fetch-utils'; +import { HAUS_RPC, ValidNetwork } from '@daohaus/keychain-utils'; import { AccountProfile } from '@daohaus/utils'; import { ListActiveDomainsDocument, @@ -14,11 +16,15 @@ import { ENSDomain, LensProfile } from './types'; import { transformProfile } from './utils'; export const getProfileForAddress = async ( - address: string + address: string, + chainId: ValidNetwork ): Promise => { - const ensDomain = await getENSDomain({ - address, - }); + const reverseEnsRecord = await getENSReverseResolver({ address, chainId }); + const ensDomain = reverseEnsRecord + ? reverseEnsRecord + : await getENSDomain({ + address, + }); const lensProfile = await getLensProfile({ memberAddress: address, } as ListProfileQueryVariables); @@ -26,6 +32,28 @@ export const getProfileForAddress = async ( return transformProfile({ address, lensProfile, ensDomain }); }; +const getENSReverseResolver = async ({ + address, + chainId +}: { + address: string; + chainId: ValidNetwork; +}) => { + try { + const provider = new providers.JsonRpcProvider(HAUS_RPC[chainId]); + const domainName = await provider.lookupAddress(address); + if (domainName) { + return { + domain: { + name: domainName, + }, + }; + } + } catch (error) { + console.error('Unable to fetch ENS reverse record', error); + } +}; + const getENSDomain = async ({ address, now = (new Date().getTime() / 1000).toFixed(0), diff --git a/libs/profile-data/src/types/ens.types.ts b/libs/profile-data/src/types/ens.types.ts index 5810cca4..fb9503a1 100644 --- a/libs/profile-data/src/types/ens.types.ts +++ b/libs/profile-data/src/types/ens.types.ts @@ -1,8 +1,8 @@ export type ENSDomain = | { - id: string; - registrationDate: string; - expiryDate: string; + id?: string; + registrationDate?: string; + expiryDate?: string; domain?: { name?: string; };