@lifi/widget
Version:
LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.
90 lines (78 loc) • 2.07 kB
text/typescript
import type { Chain, ChainType } from '@lifi/sdk'
import { getNameServiceAddress } from '@lifi/sdk'
import { useMutation } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import { getChainTypeFromAddress } from '../utils/chainType.js'
export enum AddressType {
Address = 0,
NameService = 1,
}
type ValidationArgs = {
value: string
chainType?: ChainType
chain?: Chain
}
type ValidResponse = {
address: string
addressType: AddressType
chainType: ChainType
isValid: true
}
type InvalidResponse = {
error: string
isValid: false
}
export const useAddressValidation = () => {
const { t } = useTranslation()
const { mutateAsync: validateAddress, isPending: isValidating } = useMutation(
{
mutationFn: async ({
value,
chainType,
chain,
}: ValidationArgs): Promise<ValidResponse | InvalidResponse> => {
try {
if (!value) {
throw new Error()
}
const _chainType = getChainTypeFromAddress(value)
if (_chainType) {
return {
address: value,
addressType: AddressType.Address,
chainType: _chainType,
isValid: true,
}
}
const address = await getNameServiceAddress(value, chainType)
if (address) {
const _chainType = getChainTypeFromAddress(address)
if (_chainType) {
return {
address: address,
addressType: AddressType.NameService,
chainType: _chainType,
isValid: true,
}
}
}
throw new Error()
} catch (_) {
return {
isValid: false,
error: t(
'error.title.walletAddressInvalid',
chain?.name
? { context: 'chain', chainName: chain.name }
: undefined
),
}
}
},
}
)
return {
validateAddress,
isValidating,
}
}