diff --git a/components/openEdition/MintingDetails.tsx b/components/openEdition/MintingDetails.tsx index 8b6acd5..5562c43 100644 --- a/components/openEdition/MintingDetails.tsx +++ b/components/openEdition/MintingDetails.tsx @@ -4,6 +4,9 @@ import { FormControl } from 'components/FormControl' import { FormGroup } from 'components/FormGroup' import { useInputState, useNumberInputState } from 'components/forms/FormInput.hooks' import { InputDateTime } from 'components/InputDateTime' +import { openEditionMinterList } from 'config/minter' +import type { TokenInfo } from 'config/token' +import { stars, tokensList } from 'config/token' import React, { useEffect, useState } from 'react' import { resolveAddress } from 'utils/resolveAddress' @@ -15,6 +18,7 @@ interface MintingDetailsProps { onChange: (data: MintingDetailsDataProps) => void uploadMethod: UploadMethod minimumMintPrice: number + mintTokenFromFactory?: TokenInfo | undefined } export interface MintingDetailsDataProps { @@ -23,19 +27,28 @@ export interface MintingDetailsDataProps { startTime: string endTime: string paymentAddress?: string + selectedMintToken?: TokenInfo } -export const MintingDetails = ({ onChange, uploadMethod, minimumMintPrice }: MintingDetailsProps) => { +export const MintingDetails = ({ + onChange, + uploadMethod, + minimumMintPrice, + mintTokenFromFactory, +}: MintingDetailsProps) => { const wallet = useWallet() const [timestamp, setTimestamp] = useState() const [endTimestamp, setEndTimestamp] = useState() + const [selectedMintToken, setSelectedMintToken] = useState(stars) const unitPriceState = useNumberInputState({ id: 'unitPrice', name: 'unitPrice', - title: 'Unit Price', - subtitle: `Price of each token (min. ${minimumMintPrice} STARS)`, + title: 'Mint Price', + subtitle: `Price of each token (min. ${minimumMintPrice} ${ + mintTokenFromFactory ? mintTokenFromFactory.displayName : 'STARS' + })`, placeholder: '50', }) @@ -76,15 +89,38 @@ export const MintingDetails = ({ onChange, uploadMethod, minimumMintPrice }: Min startTime: timestamp ? (timestamp.getTime() * 1_000_000).toString() : '', endTime: endTimestamp ? (endTimestamp.getTime() * 1_000_000).toString() : '', paymentAddress: paymentAddressState.value.trim(), + selectedMintToken, } onChange(data) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [unitPriceState.value, perAddressLimitState.value, timestamp, endTimestamp, paymentAddressState.value]) + }, [ + unitPriceState.value, + perAddressLimitState.value, + timestamp, + endTimestamp, + paymentAddressState.value, + selectedMintToken, + ]) return (
- +
+ + +
+ setTimestamp(date)} value={timestamp} /> diff --git a/config/minter.ts b/config/minter.ts index 6260da1..413614d 100644 --- a/config/minter.ts +++ b/config/minter.ts @@ -27,7 +27,7 @@ export const openEditionStarsMinter: MinterInfo = { } export const openEditionUpdatableStarsMinter: MinterInfo = { - id: 'open-edition-stars-minter', + id: 'open-edition-updatable-stars-minter', factoryAddress: OPEN_EDITION_UPDATABLE_FACTORY_ADDRESS, supportedToken: stars, updatable: true, @@ -41,7 +41,7 @@ export const openEditionIbcAtomMinter: MinterInfo = { } export const openEditionUpdatableIbcAtomMinter: MinterInfo = { - id: 'open-edition-ibc-atom-minter', + id: 'open-edition-updatable-ibc-atom-minter', factoryAddress: OPEN_EDITION_UPDATABLE_IBC_ATOM_FACTORY_ADDRESS, supportedToken: ibcAtom, updatable: true, @@ -55,7 +55,7 @@ export const openEditionIbcUsdcMinter: MinterInfo = { } export const openEditionUpdatableIbcUsdcMinter: MinterInfo = { - id: 'open-edition-ibc-usdc-minter', + id: 'open-edition-updatable-ibc-usdc-minter', factoryAddress: OPEN_EDITION_UPDATABLE_IBC_USDC_FACTORY_ADDRESS, supportedToken: ibcUsdc, updatable: false, @@ -69,10 +69,19 @@ export const openEditionIbcFrenzMinter: MinterInfo = { } export const openEditionUpdatableIbcFrenzMinter: MinterInfo = { - id: 'open-edition-ibc-frenz-minter', + id: 'open-edition-updatable-ibc-frenz-minter', factoryAddress: OPEN_EDITION_UPDATABLE_IBC_FRENZ_FACTORY_ADDRESS, supportedToken: ibcFrenz, updatable: true, } -export const openEditionMinterList = [openEditionStarsMinter, openEditionIbcAtomMinter, openEditionIbcFrenzMinter] +export const openEditionMinterList = [ + openEditionStarsMinter, + openEditionUpdatableStarsMinter, + openEditionUpdatableIbcAtomMinter, + openEditionIbcAtomMinter, + openEditionIbcFrenzMinter, + openEditionUpdatableIbcFrenzMinter, + openEditionIbcUsdcMinter, + openEditionUpdatableIbcUsdcMinter, +] diff --git a/pages/collections/create.tsx b/pages/collections/create.tsx index 6a99323..9493fba 100644 --- a/pages/collections/create.tsx +++ b/pages/collections/create.tsx @@ -33,6 +33,8 @@ import { Conditional } from 'components/Conditional' import { LoadingModal } from 'components/LoadingModal' import type { OpenEditionMinterCreatorDataProps } from 'components/openEdition/OpenEditionMinterCreator' import { OpenEditionMinterCreator } from 'components/openEdition/OpenEditionMinterCreator' +import { openEditionMinterList } from 'config/minter' +import type { TokenInfo } from 'config/token' import { useContracts } from 'contexts/contracts' import { addLogItem } from 'contexts/log' import { useWallet } from 'contexts/wallet' @@ -71,6 +73,8 @@ import { uid } from 'utils/random' import type { MinterType } from '../../components/collections/actions/Combobox' import type { UploadMethod } from '../../components/collections/creation/UploadDetails' import { ConfirmationModal } from '../../components/ConfirmationModal' +import type { OpenEditionMinterDetailsDataProps } from '../../components/openEdition/OpenEditionMinterCreator' +import { tokensList } from '../../config/token' import { getAssetType } from '../../utils/getAssetType' import { isValidAddress } from '../../utils/isValidAddress' @@ -99,7 +103,9 @@ const CollectionCreationPage: NextPage = () => { const [uploadDetails, setUploadDetails] = useState(null) const [collectionDetails, setCollectionDetails] = useState(null) const [baseMinterDetails, setBaseMinterDetails] = useState(null) - const [openEditionMinterDetails, setOpenEditionMinterDetails] = useState( + const [openEditionMinterCreatorData, setOpenEditionMinterCreatorData] = + useState(null) + const [openEditionMinterDetails, setOpenEditionMinterDetails] = useState( null, ) const [mintingDetails, setMintingDetails] = useState(null) @@ -122,6 +128,10 @@ const CollectionCreationPage: NextPage = () => { const [minimumOpenEditionUpdatableMintPrice, setMinimumOpenEditionUpdatableMintPrice] = useState('0') const [minimumFlexMintPrice, setMinimumFlexMintPrice] = useState('0') + const [mintTokenFromOpenEditionFactory, setMintTokenFromOpenEditionFactory] = useState( + undefined, + ) + const [uploading, setUploading] = useState(false) const [isMintingComplete, setIsMintingComplete] = useState(false) const [creatingCollection, setCreatingCollection] = useState(false) @@ -1043,7 +1053,7 @@ const CollectionCreationPage: NextPage = () => { } } - const fetchFactoryParameters = async () => { + const fetchInitialFactoryParameters = async () => { const client = wallet.client if (!client) return if (BASE_FACTORY_ADDRESS) { @@ -1100,6 +1110,7 @@ const CollectionCreationPage: NextPage = () => { setVendingMinterFlexCreationFee(vendingFactoryFlexParameters?.params?.creation_fee?.amount) setMinimumFlexMintPrice(vendingFactoryFlexParameters?.params?.min_mint_price?.amount) } + if (OPEN_EDITION_FACTORY_ADDRESS) { const openEditionFactoryParameters = await client .queryContractSmart(OPEN_EDITION_FACTORY_ADDRESS, { params: {} }) @@ -1122,6 +1133,59 @@ const CollectionCreationPage: NextPage = () => { } } + const fetchOpenEditionFactoryParameters = useCallback(async () => { + const client = wallet.client + if (!client) return + const factoryForSelectedDenom = openEditionMinterList.find( + (minter) => + minter.supportedToken === openEditionMinterDetails?.mintingDetails?.selectedMintToken && + minter.updatable === false, + ) + const updatableFactoryForSelectedDenom = openEditionMinterList.find( + (minter) => + minter.supportedToken === openEditionMinterDetails?.mintingDetails?.selectedMintToken && + minter.updatable === true, + ) + if (factoryForSelectedDenom?.factoryAddress) { + const openEditionFactoryParameters = await client + .queryContractSmart(factoryForSelectedDenom.factoryAddress, { params: {} }) + .catch((error) => { + toast.error(`${error.message}`, { style: { maxWidth: 'none' } }) + addLogItem({ id: uid(), message: error.message, type: 'Error', timestamp: new Date() }) + }) + setOpenEditionMinterCreationFee(openEditionFactoryParameters?.params?.creation_fee?.amount) + if (!openEditionMinterDetails?.collectionDetails?.updatable) { + setMinimumOpenEditionMintPrice(openEditionFactoryParameters?.params?.min_mint_price?.amount) + setMintTokenFromOpenEditionFactory( + tokensList.find((token) => token.denom === openEditionFactoryParameters?.params?.min_mint_price?.denom), + ) + } + console.log('Selected OE Factory: ', factoryForSelectedDenom) + console.log('Selected Updatable OE Factory: ', updatableFactoryForSelectedDenom) + } + if (updatableFactoryForSelectedDenom?.factoryAddress) { + const openEditionUpdatableFactoryParameters = await client + .queryContractSmart(updatableFactoryForSelectedDenom.factoryAddress, { params: {} }) + .catch((error) => { + toast.error(`${error.message}`, { style: { maxWidth: 'none' } }) + addLogItem({ id: uid(), message: error.message, type: 'Error', timestamp: new Date() }) + }) + setOpenEditionMinterUpdatableCreationFee(openEditionUpdatableFactoryParameters?.params?.creation_fee?.amount) + if (openEditionMinterDetails?.collectionDetails?.updatable) { + setMinimumOpenEditionMintPrice(openEditionUpdatableFactoryParameters?.params?.min_mint_price?.amount) + setMintTokenFromOpenEditionFactory( + tokensList.find( + (token) => token.denom === openEditionUpdatableFactoryParameters?.params?.min_mint_price?.denom, + ), + ) + } + } + }, [ + openEditionMinterDetails?.mintingDetails?.selectedMintToken, + openEditionMinterDetails?.collectionDetails?.updatable, + wallet.client, + ]) + const checkwalletBalance = async () => { const walletBalance = await wallet.client?.getBalance(wallet.address, 'ustars').then((balance) => { if (minterType === 'vending' && whitelistDetails?.whitelistState === 'new' && whitelistDetails.memberLimit) { @@ -1161,25 +1225,25 @@ const CollectionCreationPage: NextPage = () => { const syncCollections = useCallback(async () => { const collectionAddress = - minterType === 'openEdition' ? openEditionMinterDetails?.sg721ContractAddress : sg721ContractAddress + minterType === 'openEdition' ? openEditionMinterCreatorData?.sg721ContractAddress : sg721ContractAddress if (collectionAddress && SYNC_COLLECTIONS_API_URL) { await axios.get(`${SYNC_COLLECTIONS_API_URL}/${collectionAddress}`).catch((error) => { console.error('Sync collections: ', error) }) } - }, [minterType, openEditionMinterDetails?.sg721ContractAddress, sg721ContractAddress]) + }, [minterType, openEditionMinterCreatorData?.sg721ContractAddress, sg721ContractAddress]) useEffect(() => { if ( vendingMinterContractAddress !== null || - openEditionMinterDetails?.openEditionMinterContractAddress || + openEditionMinterCreatorData?.openEditionMinterContractAddress || isMintingComplete ) { scrollRef.current?.scrollIntoView({ behavior: 'smooth' }) } if ( (minterType === 'vending' && vendingMinterContractAddress !== null) || - (minterType === 'openEdition' && openEditionMinterDetails?.openEditionMinterContractAddress) || + (minterType === 'openEdition' && openEditionMinterCreatorData?.openEditionMinterContractAddress) || (minterType === 'base' && vendingMinterContractAddress !== null && isMintingComplete) ) { void syncCollections() @@ -1192,7 +1256,7 @@ const CollectionCreationPage: NextPage = () => { } }, [ vendingMinterContractAddress, - openEditionMinterDetails?.openEditionMinterContractAddress, + openEditionMinterCreatorData?.openEditionMinterContractAddress, isMintingComplete, minterType, syncCollections, @@ -1210,9 +1274,13 @@ const CollectionCreationPage: NextPage = () => { }, [minterType, baseMinterDetails?.baseMinterAcquisitionMethod, uploadDetails?.uploadMethod]) useEffect(() => { - void fetchFactoryParameters() + void fetchInitialFactoryParameters() }, [wallet.client]) + useEffect(() => { + void fetchOpenEditionFactoryParameters() + }, [fetchOpenEditionFactoryParameters]) + return (
{
@@ -1253,10 +1321,10 @@ const CollectionCreationPage: NextPage = () => { className="text-stargaze hover:underline" external href={`/contracts/openEditionMinter/query/?contractAddress=${ - openEditionMinterDetails?.openEditionMinterContractAddress as string + openEditionMinterCreatorData?.openEditionMinterContractAddress as string }`} > - {openEditionMinterDetails?.openEditionMinterContractAddress as string} + {openEditionMinterCreatorData?.openEditionMinterContractAddress as string}
SG721 Contract Address:{' '} @@ -1264,10 +1332,10 @@ const CollectionCreationPage: NextPage = () => { className="text-stargaze hover:underline" external href={`/contracts/sg721/query/?contractAddress=${ - openEditionMinterDetails?.sg721ContractAddress as string + openEditionMinterCreatorData?.sg721ContractAddress as string }`} > - {openEditionMinterDetails?.sg721ContractAddress as string} + {openEditionMinterCreatorData?.sg721ContractAddress as string}
Transaction Hash: {' '} @@ -1275,18 +1343,18 @@ const CollectionCreationPage: NextPage = () => { - {openEditionMinterDetails?.transactionHash} + {openEditionMinterCreatorData?.transactionHash} - {openEditionMinterDetails?.transactionHash} + {openEditionMinterCreatorData?.transactionHash}
@@ -1295,7 +1363,7 @@ const CollectionCreationPage: NextPage = () => { className="text-white" external href={`${STARGAZE_URL}/launchpad/${ - openEditionMinterDetails?.openEditionMinterContractAddress as string + openEditionMinterCreatorData?.openEditionMinterContractAddress as string }`} > View on Launchpad @@ -1563,8 +1631,10 @@ const CollectionCreationPage: NextPage = () => {