diff --git a/components/forms/AddressList.tsx b/components/forms/AddressList.tsx
index cbc342a..59dad9d 100644
--- a/components/forms/AddressList.tsx
+++ b/components/forms/AddressList.tsx
@@ -1,7 +1,12 @@
+import { toUtf8 } from '@cosmjs/encoding'
import { FormControl } from 'components/FormControl'
import { AddressInput } from 'components/forms/FormInput'
+import { useWallet } from 'contexts/wallet'
import { useEffect, useId, useMemo } from 'react'
+import toast from 'react-hot-toast'
import { FaMinus, FaPlus } from 'react-icons/fa'
+import { SG721_NAME_ADDRESS } from 'utils/constants'
+import { isValidAddress } from 'utils/isValidAddress'
import { useInputState } from './FormInput.hooks'
@@ -46,6 +51,7 @@ export interface AddressProps {
}
export function Address({ id, isLast, onAdd, onChange, onRemove }: AddressProps) {
+ const wallet = useWallet()
const Icon = useMemo(() => (isLast ? FaPlus : FaMinus), [isLast])
const htmlId = useId()
@@ -56,10 +62,40 @@ export function Address({ id, isLast, onAdd, onChange, onRemove }: AddressProps)
title: ``,
})
+ const resolveAddress = async (name: string) => {
+ if (!wallet.client) throw new Error('Wallet not connected')
+ await wallet.client
+ .queryContractRaw(
+ SG721_NAME_ADDRESS,
+ toUtf8(
+ Buffer.from(
+ `0006${Buffer.from('tokens').toString('hex')}${Buffer.from(name).toString('hex')}`,
+ 'hex',
+ ).toString(),
+ ),
+ )
+ .then((res) => {
+ const tokenUri = JSON.parse(new TextDecoder().decode(res as Uint8Array)).token_uri
+ if (tokenUri && isValidAddress(tokenUri)) onChange(id, { address: tokenUri })
+ else {
+ toast.error(`Resolved address is empty or invalid for the name: ${name}.stars`)
+ onChange(id, { address: '' })
+ }
+ })
+ .catch((err) => {
+ toast.error(`Error resolving address for the name: ${name}.stars`)
+ console.error(err)
+ onChange(id, { address: '' })
+ })
+ }
useEffect(() => {
- onChange(id, {
- address: addressState.value,
- })
+ if (addressState.value.endsWith('.stars')) {
+ void resolveAddress(addressState.value.split('.')[0])
+ } else {
+ onChange(id, {
+ address: addressState.value,
+ })
+ }
}, [addressState.value, id])
return (
@@ -67,7 +103,7 @@ export function Address({ id, isLast, onAdd, onChange, onRemove }: AddressProps)