import { coin } from '@cosmjs/proto-signing' import { Alert } from 'components/Alert' import { Button } from 'components/Button' import { Conditional } from 'components/Conditional' import { ContractPageHeader } from 'components/ContractPageHeader' import { FormControl } from 'components/FormControl' import { FormGroup } from 'components/FormGroup' import { NumberInput } from 'components/forms/FormInput' import { useNumberInputState } from 'components/forms/FormInput.hooks' import { InputDateTime } from 'components/InputDateTime' import { JsonPreview } from 'components/JsonPreview' import { LinkTabs } from 'components/LinkTabs' import { whitelistLinkTabs } from 'components/LinkTabs.data' import { WhitelistUpload } from 'components/WhitelistUpload' import { useContracts } from 'contexts/contracts' import { useWallet } from 'contexts/wallet' import type { InstantiateResponse } from 'contracts/sg721' import type { NextPage } from 'next' import { NextSeo } from 'next-seo' import { type FormEvent, useState } from 'react' import { toast } from 'react-hot-toast' import { FaAsterisk } from 'react-icons/fa' import { useMutation } from 'react-query' import { WHITELIST_CODE_ID } from 'utils/constants' import { withMetadata } from 'utils/layout' import { links } from 'utils/links' const Sg721InstantiatePage: NextPage = () => { const wallet = useWallet() const { whitelist: contract } = useContracts() const [startDate, setStartDate] = useState(undefined) const [endDate, setEndDate] = useState(undefined) const [whitelistArray, setWhitelistArray] = useState([]) const unitPriceState = useNumberInputState({ id: 'unit-price', name: 'unitPrice', title: 'Unit Price', subtitle: 'Price of each tokens in collection', placeholder: '500', }) const memberLimitState = useNumberInputState({ id: 'member-limit', name: 'memberLimit', title: 'Member Limit', subtitle: 'Limit of the whitelisted members', placeholder: '1000', }) const perAddressLimitState = useNumberInputState({ id: 'per-address-limit', name: 'perAddressLimit', title: 'Per Address Limit', subtitle: 'Limit of tokens per address', placeholder: '5', }) const { data, isLoading, mutate } = useMutation( async (event: FormEvent): Promise => { event.preventDefault() if (!contract) { throw new Error('Smart contract connection failed') } if (!startDate) { throw new Error('Start date is required') } if (!endDate) { throw new Error('End date is required') } const msg = { members: whitelistArray, start_time: (startDate.getTime() * 1_000_000).toString(), end_time: (endDate.getTime() * 1_000_000).toString(), mint_price: coin(String(Number(unitPriceState.value) * 1000000), 'ustars'), per_address_limit: perAddressLimitState.value, member_limit: memberLimitState.value, } return toast.promise( contract.instantiate(WHITELIST_CODE_ID, msg, 'Stargaze Whitelist Contract', wallet.address), { loading: 'Instantiating contract...', error: 'Instantiation failed!', success: 'Instantiation success!', }, ) }, { onError: (error) => { toast.error(String(error), { style: { maxWidth: 'none' } }) }, }, ) const whitelistFileOnChange = (whitelistData: string[]) => { setWhitelistArray(whitelistData) } return (
Instantiate success! Here is the transaction result containing the contract address and the transaction hash.
0}> setStartDate(date)} value={startDate} /> setEndDate(date)} value={endDate} />
) } export default withMetadata(Sg721InstantiatePage, { center: false })