diff --git a/apps/scan/src/app/(app)/_hooks/send/use-evm-send.ts b/apps/scan/src/app/(app)/_hooks/send/use-evm-send.ts index c6a46b7eb..a1d8c82cc 100644 --- a/apps/scan/src/app/(app)/_hooks/send/use-evm-send.ts +++ b/apps/scan/src/app/(app)/_hooks/send/use-evm-send.ts @@ -6,7 +6,7 @@ import { usdc } from '@/lib/tokens/usdc'; import { useEvmTokenBalance } from '../balance/token/use-evm-token-balance'; -import { ethereumAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema } from '@/lib/schemas'; import { useWalletChain } from '@/app/(app)/_contexts/wallet-chain/hook'; import { useEvmX402Fetch } from '../x402/evm'; @@ -100,7 +100,7 @@ export const useEvmSend = (props?: Props) => { toast.error('Amount is required'); return; } - const parseResult = ethereumAddressSchema.safeParse(toAddress); + const parseResult = evmAddressSchema.safeParse(toAddress); if (!parseResult.success) { toast.error('Invalid address'); return; @@ -133,7 +133,7 @@ export const useEvmSend = (props?: Props) => { balance < amount || isBalanceLoading || isSent || - !ethereumAddressSchema.safeParse(toAddress).success, + !evmAddressSchema.safeParse(toAddress).success, isPending: isSending, statusText, }; diff --git a/apps/scan/src/app/(app)/composer/(chat)/_components/chat/input/wallet/content/send.tsx b/apps/scan/src/app/(app)/composer/(chat)/_components/chat/input/wallet/content/send.tsx index 49cc3055d..a955aa63f 100644 --- a/apps/scan/src/app/(app)/composer/(chat)/_components/chat/input/wallet/content/send.tsx +++ b/apps/scan/src/app/(app)/composer/(chat)/_components/chat/input/wallet/content/send.tsx @@ -16,7 +16,7 @@ import { api } from '@/trpc/client'; import { useWalletChain } from '@/app/(app)/_contexts/wallet-chain/hook'; -import { ethereumAddressSchema, solanaAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema, solanaAddressSchema } from '@/lib/schemas'; import { usdc } from '@/lib/tokens/usdc'; import { formatAddress } from '@/lib/utils'; @@ -59,7 +59,7 @@ export const Send: React.FC = () => { } = api.user.serverWallet.sendUsdc.useMutation(); const schema = - chain === ChainType.SOLANA ? solanaAddressSchema : ethereumAddressSchema; + chain === ChainType.SOLANA ? solanaAddressSchema : evmAddressSchema; const handleSubmit = useCallback(() => { const parseResult = schema.safeParse(address); diff --git a/apps/scan/src/app/mcp/deposit/[address]/[method]/page.tsx b/apps/scan/src/app/mcp/deposit/[address]/[method]/page.tsx index abe44dede..f15149aad 100644 --- a/apps/scan/src/app/mcp/deposit/[address]/[method]/page.tsx +++ b/apps/scan/src/app/mcp/deposit/[address]/[method]/page.tsx @@ -5,12 +5,12 @@ import { notFound } from 'next/navigation'; import { METHODS } from './_components/methods'; import { Body } from '@/app/_components/layout/page-utils'; -import { ethereumAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema } from '@/lib/schemas'; import { OnrampMethods, OnrampProviders } from '@/services/onramp/types'; const paramsSchema = z.object({ - address: ethereumAddressSchema, + address: evmAddressSchema, method: z.union([z.literal(OnrampMethods.WALLET), z.enum(OnrampProviders)]), }); diff --git a/apps/scan/src/app/mcp/deposit/[address]/layout.tsx b/apps/scan/src/app/mcp/deposit/[address]/layout.tsx index 7110bdf5a..88907b1a9 100644 --- a/apps/scan/src/app/mcp/deposit/[address]/layout.tsx +++ b/apps/scan/src/app/mcp/deposit/[address]/layout.tsx @@ -1,4 +1,4 @@ -import { ethereumAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema } from '@/lib/schemas'; export default async function DepositLayout({ children, @@ -6,7 +6,7 @@ export default async function DepositLayout({ }: LayoutProps<'/mcp/deposit/[address]'>) { const { address } = await params; - const parsedAddress = ethereumAddressSchema.safeParse(address); + const parsedAddress = evmAddressSchema.safeParse(address); if (!parsedAddress.success) { throw new Error('Invalid address'); diff --git a/apps/scan/src/lib/schemas.ts b/apps/scan/src/lib/schemas.ts index 29bd7d633..2be8995b4 100644 --- a/apps/scan/src/lib/schemas.ts +++ b/apps/scan/src/lib/schemas.ts @@ -2,13 +2,13 @@ import z from 'zod'; import { Chain, SUPPORTED_CHAINS } from '@/types/chain'; -import { getAddress, isAddress, type Address } from 'viem'; +import { getAddress, isAddress } from 'viem'; import type { MixedAddress, SolanaAddress } from '@/types/address'; -export const ethereumAddressSchema = z +export const evmAddressSchema = z .string() - .regex(/^0x[a-fA-F0-9]{40}$/, 'Invalid Ethereum address') - .transform(address => address.toLowerCase() as Address); + .refine(isAddress, 'Invalid EVM address') + .transform(a => getAddress(a)); export const sortingSchema = (sortIds: string[] | readonly string[]) => z.object({ @@ -23,7 +23,7 @@ export const solanaAddressSchema = z // Create a mixed address schema export const mixedAddressSchema = z - .union([ethereumAddressSchema, solanaAddressSchema]) + .union([evmAddressSchema, solanaAddressSchema]) .transform(address => address as MixedAddress); export const chainSchema = z.enum(Chain); @@ -46,8 +46,3 @@ export const sendUsdcQueryParamsSchema = z.object({ address: mixedAddressSchema, chain: supportedChainSchema, }); - -export const evmAddressSchema = z - .string() - .refine(isAddress, 'Invalid EVM address') - .transform(a => getAddress(a)); diff --git a/apps/scan/src/services/cdp/onramp/create-onramp-session.ts b/apps/scan/src/services/cdp/onramp/create-onramp-session.ts index 487628a31..96b086a26 100644 --- a/apps/scan/src/services/cdp/onramp/create-onramp-session.ts +++ b/apps/scan/src/services/cdp/onramp/create-onramp-session.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { cdpFetch } from '../lib/fetch'; -import { ethereumAddressSchema, solanaAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema, solanaAddressSchema } from '@/lib/schemas'; import { Chain, SUPPORTED_CHAINS } from '@/types/chain'; export const createOnrampUrlParamsSchema = z.object({ @@ -33,7 +33,7 @@ export const createOnrampUrl = async ( const address = defaultNetwork === Chain.SOLANA ? solanaAddressSchema.parse(addressInput) - : ethereumAddressSchema.parse(addressInput); + : evmAddressSchema.parse(addressInput); const { token } = await cdpFetch( { diff --git a/apps/scan/src/trpc/routers/onramp/coinbase.ts b/apps/scan/src/trpc/routers/onramp/coinbase.ts index 14069e699..0e2f26096 100644 --- a/apps/scan/src/trpc/routers/onramp/coinbase.ts +++ b/apps/scan/src/trpc/routers/onramp/coinbase.ts @@ -8,7 +8,7 @@ import { getOnrampTransactions, } from '@/services/onramp/coinbase/onramp-session'; -import { ethereumAddressSchema } from '@/lib/schemas'; +import { evmAddressSchema } from '@/lib/schemas'; export const coinbaseOnrampRouter = createTRPCRouter({ session: { @@ -21,7 +21,7 @@ export const coinbaseOnrampRouter = createTRPCRouter({ create: publicProcedure .input( createOnrampUrlParamsSchema.extend({ - address: ethereumAddressSchema, + address: evmAddressSchema, }) ) .mutation(async ({ input }) => {