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..c31735d6 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 { HAUS_NETWORK_DATA, ValidNetwork } from '@daohaus/keychain-utils'; export const getProfileStore = async () => (await getlocalForage(CacheStoreName.MEMBERS_PROFILE)) as ArbitraryState; @@ -60,11 +61,17 @@ 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); + // Workaround when poiting to a network where ENS is not deployed + const daochain = !['0x1', '0x5'].includes(chainId) ? '0x1' : chainId; + const profile = await getProfileForAddress( + address, + HAUS_NETWORK_DATA[daochain]?.rpc + ); 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..8fbe86b9 100644 --- a/libs/connect-context/src/utils/contextHelpers.ts +++ b/libs/connect-context/src/utils/contextHelpers.ts @@ -135,12 +135,15 @@ export const loadWallet = async ({ export const loadProfile = async ({ address, + chainId, setProfile, setProfileLoading, shouldUpdate, lifeCycleFns, + networks, }: { address: string; + chainId: ValidNetwork; setProfile: Dispatch>; setProfileLoading: Dispatch>; shouldUpdate: boolean; @@ -149,7 +152,12 @@ export const loadProfile = async ({ }) => { try { setProfileLoading(true); - const profile = await getProfileForAddress(address); + // Workaround when poiting to a network where ENS is not deployed + const daochain = !['0x1', '0x5'].includes(chainId) ? '0x1' : chainId; + const profile = await getProfileForAddress( + address, + networks[daochain]?.rpc + ); if (profile && shouldUpdate) { const displayName = diff --git a/libs/profile-data/src/profile.ts b/libs/profile-data/src/profile.ts index b9ac17ff..3d8c7c15 100644 --- a/libs/profile-data/src/profile.ts +++ b/libs/profile-data/src/profile.ts @@ -1,3 +1,4 @@ +import { providers } from 'ethers'; import { graphFetchList } from '@daohaus/data-fetch-utils'; import { AccountProfile } from '@daohaus/utils'; import { @@ -14,11 +15,16 @@ import { ENSDomain, LensProfile } from './types'; import { transformProfile } from './utils'; export const getProfileForAddress = async ( - address: string + address: string, + rpcUri?: string ): Promise => { - const ensDomain = await getENSDomain({ - address, - }); + const reverseEnsRecord = + rpcUri && (await getENSReverseResolver({ address, rpcUri })); + 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, + rpcUri, +}: { + address: string; + rpcUri: string; +}) => { + try { + const provider = new providers.JsonRpcProvider(rpcUri); + 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; };