Skip to content

Commit e3f9689

Browse files
authored
feat: ens-resolver (#143)
* feat: resolve ens name in Impersonated Form * chore: update placeholder
1 parent 96f639d commit e3f9689

File tree

2 files changed

+57
-6
lines changed

2 files changed

+57
-6
lines changed

src/ui/utils/texts.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ export const texts = {
267267
needHelpFAQ: 'Read FAQ',
268268
needHelpDescription:
269269
'By selecting a wallet from an External Provider, you agree to their Terms and Conditions. Your ability to access the wallet may depend on the External Provider being operational.',
270-
impersonatedInputPlaceholder: 'Account address',
270+
impersonatedInputPlaceholder: 'Account address or ENS name',
271271
impersonatedButtonTitle: 'Connect',
272272
representing: 'Representing',
273273
representative: 'You are representing',

src/web3/components/wallet/ImpersonatedForm.tsx

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,58 @@
11
import { WalletType } from '@bgd-labs/frontend-web3-utils';
22
import { Box } from '@mui/system';
3-
import React from 'react';
3+
import React, { useState } from 'react';
44
import { Field, Form } from 'react-final-form';
5+
import { isAddress } from 'viem';
56

67
import { useStore } from '../../../store/ZustandStoreProvider';
78
import { BigButton, Input } from '../../../ui';
89
import { texts } from '../../../ui/utils/texts';
910
import { appConfig } from '../../../utils/appConfig';
11+
import { isEnsName } from '../../utils/ensHelpers';
1012

1113
export function ImpersonatedForm() {
1214
const impersonated = useStore((store) => store.impersonated);
1315
const setImpersonated = useStore((store) => store.setImpersonated);
1416
const connectWallet = useStore((store) => store.connectWallet);
17+
const fetchAddressByEnsName = useStore(
18+
(store) => store.fetchAddressByEnsName,
19+
);
20+
21+
const [isResolving, setIsResolving] = useState(false);
22+
const [error, setError] = useState<string | undefined>();
1523

1624
const handleFormSubmit = async ({
1725
impersonatedAddress,
1826
}: {
1927
impersonatedAddress: string;
2028
}) => {
21-
setImpersonated(impersonatedAddress);
22-
await connectWallet(WalletType.Impersonated, appConfig.govCoreChainId);
29+
setError(undefined);
30+
setIsResolving(true);
31+
32+
try {
33+
let resolvedAddress = impersonatedAddress;
34+
35+
if (isEnsName(impersonatedAddress)) {
36+
const resolved = await fetchAddressByEnsName(impersonatedAddress);
37+
if (!resolved) {
38+
setError('Invalid ENS name or address not found');
39+
setIsResolving(false);
40+
return;
41+
}
42+
resolvedAddress = resolved;
43+
} else if (!isAddress(impersonatedAddress)) {
44+
setError('Invalid address format');
45+
setIsResolving(false);
46+
return;
47+
}
48+
49+
setImpersonated(resolvedAddress);
50+
await connectWallet(WalletType.Impersonated, appConfig.govCoreChainId);
51+
} catch (err) {
52+
setError('Failed to resolve address');
53+
} finally {
54+
setIsResolving(false);
55+
}
2356
};
2457

2558
return (
@@ -59,14 +92,32 @@ export function ImpersonatedForm() {
5992
)}
6093
</Field>
6194

95+
{error && (
96+
<Box
97+
sx={{
98+
color: '$error',
99+
fontSize: 12,
100+
mt: 8,
101+
textAlign: 'center',
102+
}}>
103+
{error}
104+
</Box>
105+
)}
106+
62107
<Box
63108
sx={{
64109
display: 'flex',
65110
alignItems: 'center',
66111
justifyContent: 'center',
67112
}}>
68-
<BigButton alwaysWithBorders type="submit" css={{ mt: 60 }}>
69-
{texts.walletConnect.impersonatedButtonTitle}
113+
<BigButton
114+
alwaysWithBorders
115+
type="submit"
116+
css={{ mt: 60 }}
117+
disabled={isResolving}>
118+
{isResolving
119+
? 'Resolving...'
120+
: texts.walletConnect.impersonatedButtonTitle}
70121
</BigButton>
71122
</Box>
72123
</Box>

0 commit comments

Comments
 (0)