Skip to content

Commit 0993688

Browse files
committed
fix: valid address
1 parent a5d660e commit 0993688

File tree

4 files changed

+23
-21
lines changed

4 files changed

+23
-21
lines changed

features/create-vault/create-vault-form/stages/main-settings/create-vault-input/address-input-base.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { forwardRef, useState } from 'react';
2-
import { Address, isAddress } from 'viem';
2+
import { Address } from 'viem';
33
import {
44
UseFormRegisterReturn,
55
useFormContext,
@@ -11,6 +11,7 @@ import { AddressLinkEtherscan } from 'shared/components';
1111
import { AddressInputWrapper, EtherScanLink } from './styles';
1212

1313
import { ReactComponent as ErrorTriangle } from 'assets/icons/error-triangle.svg';
14+
import { addressSchema } from 'utils/validate-form-value';
1415

1516
type AddressInputProps = Omit<UseFormRegisterReturn, 'ref'> &
1617
React.ComponentProps<typeof Input>;
@@ -24,10 +25,12 @@ export const AddressInputBase = forwardRef<HTMLInputElement, AddressInputProps>(
2425

2526
const { invalid, isDirty, isValidating, error } = getFieldState(name);
2627

27-
const value = useWatch<{ value: Address }>({ name });
28+
const { data: value } = addressSchema.safeParse(
29+
useWatch<{ value: Address }>({ name }),
30+
);
2831

2932
const decorator = (() => {
30-
if (isAddress(value)) {
33+
if (value) {
3134
if (invalid) return <ErrorTriangle />;
3235
if (invalid && isValidating) return <Loader size="small" />;
3336
if (!isDirty) return null;

features/create-vault/create-vault-form/validation.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import { Address } from 'viem';
21
import { z, ZodTypeAny } from 'zod';
32

4-
import { isValidAnyAddress } from 'utils/address-validation';
53
import {
64
MIN_FEE_VALUE,
75
MAX_FEE_VALUE,
@@ -13,8 +11,7 @@ import {
1311
} from 'modules/vaults';
1412

1513
import type { PermissionKeys } from 'features/create-vault/types';
16-
17-
const INVALID_ADDRESS_MESSAGE = 'Invalid ethereum address';
14+
import { addressSchema } from 'utils/validate-form-value';
1815

1916
const INVALID_NUMBER_MIN_MESSAGE = `Must be ${MIN_FEE_VALUE} or above`;
2017
const INVALID_NUMBER_MAX_MESSAGE = `Must be ${MAX_FEE_VALUE} or less`;
@@ -41,15 +38,6 @@ const validateBasisPoints = (value: number) =>
4138
Math.floor(value * VAULT_TOTAL_BASIS_POINTS) ===
4239
0;
4340

44-
const validateAddress = (value: string | null) =>
45-
!!(value && isValidAnyAddress(value));
46-
47-
const addressSchema = z
48-
.string()
49-
.trim()
50-
.refine(validateAddress, { message: INVALID_ADDRESS_MESSAGE })
51-
.transform((value) => value.toLocaleLowerCase() as Address);
52-
5341
const numberSchema = (zodPipe: ZodTypeAny) =>
5442
z.coerce
5543
.string(INVALID_NUMBER_DATA_OBJECT_MESSAGE)

shared/components/address-badge/address-badge.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99

1010
import { AddressPopover } from './address-popover';
1111
import { PillContainer, AddressText } from './styles';
12+
import { addressSchema } from 'utils/validate-form-value';
1213

1314
export type AddressBadgeProps = {
1415
address?: string;
@@ -40,8 +41,7 @@ export const AddressBadge = forwardRef<HTMLDivElement, AddressBadgeProps>(
4041
const backupRef = useRef<HTMLDivElement>(null);
4142
const ref = forwardedRef || backupRef;
4243
const [isOpen, setIsOpen] = useState(false);
43-
44-
const address = props.address?.trim().toLowerCase();
44+
const parsing = addressSchema.safeParse(props.address);
4545

4646
const onClick = showPopover
4747
? (event: MouseEvent) => {
@@ -65,9 +65,9 @@ export const AddressBadge = forwardRef<HTMLDivElement, AddressBadgeProps>(
6565
);
6666
}
6767

68-
if (!address) {
69-
return null;
70-
}
68+
if (!parsing.success) return null;
69+
70+
const address = parsing.data;
7171

7272
return (
7373
<>

utils/validate-form-value.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { z, ZodSchema } from 'zod';
2+
import { type Address, isAddress } from 'viem';
23
import { appendErrors, FieldError, Resolver } from 'react-hook-form';
34
import { isZodError } from 'utils/errors';
45

6+
const INVALID_ADDRESS_MESSAGE = 'Invalid ethereum address';
7+
58
export const parseZodErrorSchema = (
69
zodErrors: z.ZodIssue[],
710
validateAllFieldCriteria: boolean,
@@ -77,3 +80,11 @@ export const validateFormWithZod = <T extends ZodSchema>(
7780
}
7881
};
7982
};
83+
84+
const validateAddress = (value: string | null) => !!(value && isAddress(value));
85+
86+
export const addressSchema = z
87+
.string()
88+
.trim()
89+
.refine(validateAddress, { message: INVALID_ADDRESS_MESSAGE })
90+
.transform((value) => value.toLocaleLowerCase() as Address);

0 commit comments

Comments
 (0)