76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
import { useAccount, useSimulateContract, useWriteContract } from 'wagmi';
|
|
import { useQuery } from '@tanstack/react-query';
|
|
import { namehash } from 'viem';
|
|
import { DEV_MODE, REGISTER_CONTRACT_ADDR, TLD } from '../constants';
|
|
import { abi } from '../abi';
|
|
|
|
const HashZero =
|
|
'0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
|
|
const fetchSignature = async (buyer, subdomainHash, nonce) => {
|
|
const params = new URLSearchParams({
|
|
buyer,
|
|
subdomainHash,
|
|
nonce: nonce.toString(),
|
|
});
|
|
|
|
const host = DEV_MODE ? 'hnst.id' : 'hns.id';
|
|
|
|
return fetch(
|
|
`https://${host}/api/gateway/registration?${params.toString()}`,
|
|
{
|
|
headers: {
|
|
origin: window.location.origin,
|
|
},
|
|
}
|
|
)
|
|
.then((response) => response.json())
|
|
.then((data) => data.signature);
|
|
};
|
|
|
|
export const useRegister = ({
|
|
label,
|
|
priceInWei,
|
|
years = 1,
|
|
nonce = 0,
|
|
} = {}) => {
|
|
const tldHash = namehash(TLD);
|
|
const nameHash = namehash(`${label}.${TLD}`);
|
|
const registrationDays = BigInt(years * 365);
|
|
|
|
const { address, isConnected } = useAccount();
|
|
|
|
const { data: signature } = useQuery({
|
|
queryKey: ['signature', address, nameHash, nonce.toString()],
|
|
queryFn: () => fetchSignature(address, nameHash, nonce),
|
|
enabled: isConnected,
|
|
});
|
|
|
|
const { data, failureReason } = useSimulateContract({
|
|
abi,
|
|
address: REGISTER_CONTRACT_ADDR,
|
|
functionName: 'registerWithSignature',
|
|
account: address,
|
|
value: priceInWei,
|
|
enabled: !!signature && !!priceInWei && !!address,
|
|
args: [
|
|
label,
|
|
registrationDays,
|
|
tldHash,
|
|
address,
|
|
signature?.v ?? 0,
|
|
signature?.r ?? HashZero,
|
|
signature?.s ?? HashZero,
|
|
],
|
|
});
|
|
|
|
const { writeContractAsync } = useWriteContract();
|
|
return () => {
|
|
if (failureReason && !data?.request) {
|
|
return Promise.reject(failureReason);
|
|
}
|
|
|
|
return writeContractAsync(data?.request);
|
|
};
|
|
};
|