diff --git a/app/ts/components/TokenAdd.tsx b/app/ts/components/TokenAdd.tsx index 211a49eb..ff5d0881 100644 --- a/app/ts/components/TokenAdd.tsx +++ b/app/ts/components/TokenAdd.tsx @@ -134,7 +134,7 @@ const AddTokenDialog = ({ children }: { children: ComponentChildren }) => { useSignalEffect(setClickListenerForDialog) return ( - + { children } ) @@ -162,7 +162,9 @@ const QueryAddressField = () => { const parsedAddress = EthereumAddress.safeParse(inputField.value) if (!parsedAddress.success) { - event.target.setCustomValidity('Requires a valid ERC20 contract address') + let errorMessage = 'Requires a valid ERC20 contract address' + if (parsedAddress.message === 'Invalid address checksum.') { errorMessage = parsedAddress.message } + event.target.setCustomValidity(errorMessage) event.target.reportValidity() return } @@ -180,7 +182,7 @@ const QueryAddressField = () => { } const QueryStatus = () => { - const { address, tokenQuery } = useTokenQuery() + const { tokenQuery } = useTokenQuery() switch (tokenQuery.value.state) { case 'inactive': @@ -205,31 +207,21 @@ const QueryStatus = () => { ) case 'resolved': - const token = serialize(ERC20Token, tokenQuery.value.value) + // queried token will have included a checksum address + const fetchedToken = tokenQuery.value.value return (
Found a matching address
-
{ token.name } ({ token.symbol })
-
{ token.address }
+
{ fetchedToken.name } ({ fetchedToken.symbol })
+
{ fetchedToken.address }
-
) } } -const AddressChecksumWarning = ({ show }: { show?: boolean }) => { - if (!show) return <> - return ( - <> -

You entered an address that does not have the correct checksum and Lunaria tried to fetch the address without it.

- - - ) -} - const TokenDataToFields = () => { const { cache } = useTokenManager() const { tokenQuery } = useTokenQuery() @@ -241,7 +233,7 @@ const TokenDataToFields = () => { return ( <> - { Object.keys(token).map(key => ) } + { Object.entries(token).map(([key, value]) => )} ) diff --git a/app/ts/components/TransferResult.tsx b/app/ts/components/TransferResult.tsx index 4fdb66b7..c4eba988 100644 --- a/app/ts/components/TransferResult.tsx +++ b/app/ts/components/TransferResult.tsx @@ -6,7 +6,6 @@ import { useTransfer } from '../context/Transfer.js' import { humanReadableEthersError, isEthersError } from '../library/errors.js' import { areEqualStrings } from '../library/utilities.js' import { CopyButton } from './CopyButton.js' -import { getAddress } from 'ethers' export const TransferResult = () => { const { account } = useWallet() @@ -19,16 +18,6 @@ export const TransferResult = () => { return account.value.value === input.value.to }) - const recipientChecksumValid = useComputed(() => { - const inputAddress = input.value.to - - if (inputAddress.match(/^(0x)?[0-9a-fA-F]{40}$/)) { - if (getAddress(inputAddress.toLowerCase()) !== inputAddress && inputAddress.toLowerCase() !== inputAddress) return false - } - - return true - }) - const recipientIsAKnownToken = useComputed(() => tokensCache.value.data.some(token => areEqualStrings(token.address, input.value.to))) switch (transaction.value.state) { @@ -39,9 +28,6 @@ export const TransferResult = () => { if (recipientIsAKnownToken.value) { return } - if (!recipientChecksumValid.value) { - return - } return <> case 'rejected': const txError = transaction.value.error diff --git a/app/ts/schema.ts b/app/ts/schema.ts index 8bb53e8f..a58d4657 100644 --- a/app/ts/schema.ts +++ b/app/ts/schema.ts @@ -1,4 +1,4 @@ -import { getAddress, isHexString, parseUnits } from 'ethers' +import { getAddress, isError, isHexString, parseUnits } from 'ethers' import * as funtypes from 'funtypes' export function createCacheParser(funType: funtypes.Codec) { @@ -50,9 +50,14 @@ export function createUnitParser(decimals?: bigint): funtypes.ParsedValue['config'] = { parse: value => { - if (!/^(0x)?[0-9a-fA-F]{40}$/.test(value)) return { success: false, message: `${value} is not a valid address.` } - const checksummedAddress = getAddress(value.toLowerCase()) - return { success: true, value: checksummedAddress } + try { + const checksummedAddress = getAddress(value) + return { success: true, value: checksummedAddress } + } catch(error) { + let errorMessage =`${value} is not a valid address.` + if (isError(error, 'INVALID_ARGUMENT') && error.message.includes('bad address checksum')) { errorMessage = 'Invalid address checksum.' } + return { success: false, message: errorMessage } + } }, serialize: funtypes.String.safeParse, } @@ -82,7 +87,7 @@ export const TransferSchema = funtypes.Object({ export type Transfer = funtypes.Static export const TransferRequestInput = funtypes.Object({ - to: funtypes.String, + to: EthereumAddress, amount: BigIntHex, token: ERC20Token.Or(funtypes.Undefined), })