Handle non-STARS creation fees for open/limited edition minter

This commit is contained in:
Serkan Reis 2024-05-22 21:02:12 +03:00
parent fa1475f109
commit 3bbed658a7
2 changed files with 45 additions and 19 deletions

View File

@ -5,6 +5,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
import { toUtf8 } from '@cosmjs/encoding' import { toUtf8 } from '@cosmjs/encoding'
import type { Coin } from '@cosmjs/proto-signing'
import { coin } from '@cosmjs/proto-signing' import { coin } from '@cosmjs/proto-signing'
import axios from 'axios' import axios from 'axios'
import clsx from 'clsx' import clsx from 'clsx'
@ -13,7 +14,7 @@ import type { MinterType } from 'components/collections/actions/Combobox'
import { Conditional } from 'components/Conditional' import { Conditional } from 'components/Conditional'
import { ConfirmationModal } from 'components/ConfirmationModal' import { ConfirmationModal } from 'components/ConfirmationModal'
import { LoadingModal } from 'components/LoadingModal' import { LoadingModal } from 'components/LoadingModal'
import { type TokenInfo } from 'config/token' import { type TokenInfo, tokensList } from 'config/token'
import { useContracts } from 'contexts/contracts' import { useContracts } from 'contexts/contracts'
import { addLogItem } from 'contexts/log' import { addLogItem } from 'contexts/log'
import type { DispatchExecuteArgs as OpenEditionFactoryDispatchExecuteArgs } from 'contracts/openEditionFactory/messages/execute' import type { DispatchExecuteArgs as OpenEditionFactoryDispatchExecuteArgs } from 'contracts/openEditionFactory/messages/execute'
@ -73,7 +74,7 @@ export interface OpenEditionMinterDetailsDataProps {
interface OpenEditionMinterCreatorProps { interface OpenEditionMinterCreatorProps {
onChange: (data: OpenEditionMinterCreatorDataProps) => void onChange: (data: OpenEditionMinterCreatorDataProps) => void
onDetailsChange: (data: OpenEditionMinterDetailsDataProps) => void onDetailsChange: (data: OpenEditionMinterDetailsDataProps) => void
openEditionMinterCreationFee?: string openEditionMinterCreationFee?: Coin
minimumMintPrice?: string minimumMintPrice?: string
minterType?: MinterType minterType?: MinterType
mintTokenFromFactory?: TokenInfo | undefined mintTokenFromFactory?: TokenInfo | undefined
@ -480,20 +481,45 @@ export const OpenEditionMinterCreator = ({
const checkwalletBalance = async () => { const checkwalletBalance = async () => {
if (!wallet.isWalletConnected) throw new Error('Wallet not connected.') if (!wallet.isWalletConnected) throw new Error('Wallet not connected.')
let amountNeeded = 0 const queryClient = await wallet.getCosmWasmClient()
if (whitelistDetails?.whitelistState === 'new' && whitelistDetails.memberLimit) { const creationFeeDenom = tokensList.find((token) => token.denom === openEditionMinterCreationFee?.denom)
amountNeeded = await queryClient.getBalance(wallet.address || '', 'ustars').then(async (starsBalance) => {
Math.ceil(Number(whitelistDetails.memberLimit) / 1000) * 100000000 + Number(openEditionMinterCreationFee) await queryClient
} else { .getBalance(wallet.address || '', openEditionMinterCreationFee?.denom as string)
amountNeeded = openEditionMinterCreationFee ? Number(openEditionMinterCreationFee) : 0 .then((creationFeeDenomBalance) => {
} if (whitelistDetails?.whitelistState === 'new' && whitelistDetails.memberLimit) {
await (await wallet.getCosmWasmClient()).getBalance(wallet.address || '', 'ustars').then((balance) => { const whitelistCreationFee = Math.ceil(Number(whitelistDetails.memberLimit) / 1000) * 100000000
if (amountNeeded >= Number(balance.amount)) if (openEditionMinterCreationFee?.denom === 'ustars') {
throw new Error( const amountNeeded = whitelistCreationFee + Number(openEditionMinterCreationFee.amount)
`Insufficient wallet balance to instantiate the required contracts. Needed amount: ${( if (amountNeeded >= Number(starsBalance.amount))
amountNeeded / 1000000 throw new Error(
).toString()} STARS`, `Insufficient wallet balance to instantiate the required contracts. Needed amount: ${(
) amountNeeded / 1000000
).toString()} STARS`,
)
} else {
if (whitelistCreationFee >= Number(starsBalance.amount))
throw new Error(
`Insufficient wallet balance to instantiate the whitelist. Needed amount: ${(
whitelistCreationFee / 1000000
).toString()} STARS`,
)
if (Number(openEditionMinterCreationFee?.amount) > Number(creationFeeDenomBalance.amount))
throw new Error(
`Insufficient wallet balance to instantiate the required contracts. Needed amount: ${(
Number(openEditionMinterCreationFee?.amount) / 1000000
).toString()} ${
creationFeeDenom ? creationFeeDenom.displayName : openEditionMinterCreationFee?.denom
}`,
)
}
} else if (Number(openEditionMinterCreationFee?.amount) > Number(creationFeeDenomBalance.amount))
throw new Error(
`Insufficient wallet balance to instantiate the required contracts. Needed amount: ${(
Number(openEditionMinterCreationFee?.amount) / 1000000
).toString()} ${creationFeeDenom ? creationFeeDenom.displayName : openEditionMinterCreationFee?.denom}`,
)
})
}) })
} }
@ -899,7 +925,7 @@ export const OpenEditionMinterCreator = ({
messages: openEditionFactoryMessages, messages: openEditionFactoryMessages,
txSigner: wallet.address || '', txSigner: wallet.address || '',
msg, msg,
funds: [coin(openEditionMinterCreationFee as string, 'ustars')], funds: [openEditionMinterCreationFee as Coin],
updatable: collectionDetails?.updatable, updatable: collectionDetails?.updatable,
} }
await openEditionFactoryDispatchExecute(payload) await openEditionFactoryDispatchExecute(payload)

View File

@ -130,7 +130,7 @@ const CollectionCreationPage: NextPage = () => {
const [vendingMinterCreationFee, setVendingMinterCreationFee] = useState<Coin | null>(null) const [vendingMinterCreationFee, setVendingMinterCreationFee] = useState<Coin | null>(null)
const [baseMinterCreationFee, setBaseMinterCreationFee] = useState<Coin | null>(null) const [baseMinterCreationFee, setBaseMinterCreationFee] = useState<Coin | null>(null)
const [vendingMinterUpdatableCreationFee, setVendingMinterUpdatableCreationFee] = useState<Coin | null>(null) const [vendingMinterUpdatableCreationFee, setVendingMinterUpdatableCreationFee] = useState<Coin | null>(null)
const [openEditionMinterCreationFee, setOpenEditionMinterCreationFee] = useState<Coin | null>(null) const [openEditionMinterCreationFee, setOpenEditionMinterCreationFee] = useState<Coin | undefined>(undefined)
const [vendingMinterFlexCreationFee, setVendingMinterFlexCreationFee] = useState<Coin | null>(null) const [vendingMinterFlexCreationFee, setVendingMinterFlexCreationFee] = useState<Coin | null>(null)
const [baseMinterUpdatableCreationFee, setBaseMinterUpdatableCreationFee] = useState<Coin | null>(null) const [baseMinterUpdatableCreationFee, setBaseMinterUpdatableCreationFee] = useState<Coin | null>(null)
const [minimumMintPrice, setMinimumMintPrice] = useState<string | null>('0') const [minimumMintPrice, setMinimumMintPrice] = useState<string | null>('0')
@ -1958,7 +1958,7 @@ const CollectionCreationPage: NextPage = () => {
onChange={setOpenEditionMinterCreatorData} onChange={setOpenEditionMinterCreatorData}
onDetailsChange={setOpenEditionMinterDetails} onDetailsChange={setOpenEditionMinterDetails}
openEditionFactoryAddress={openEditionFactoryAddress} openEditionFactoryAddress={openEditionFactoryAddress}
openEditionMinterCreationFee={openEditionMinterCreationFee?.amount as string} openEditionMinterCreationFee={openEditionMinterCreationFee}
/> />
</Conditional> </Conditional>
<div className="mx-10"> <div className="mx-10">