Include open edition minter actions in Collection Actions > Actions

This commit is contained in:
Serkan Reis 2023-06-17 11:01:32 +03:00
parent 52632ff42d
commit 6b89a60216
4 changed files with 118 additions and 5 deletions

View File

@ -15,6 +15,7 @@ import { JsonPreview } from 'components/JsonPreview'
import { TransactionHash } from 'components/TransactionHash'
import { useWallet } from 'contexts/wallet'
import type { BaseMinterInstance } from 'contracts/baseMinter'
import type { OpenEditionMinterInstance } from 'contracts/openEditionMinter'
import type { SG721Instance } from 'contracts/sg721'
import type { VendingMinterInstance } from 'contracts/vendingMinter'
import type { FormEvent } from 'react'
@ -35,6 +36,7 @@ interface CollectionActionsProps {
sg721Messages: SG721Instance | undefined
vendingMinterMessages: VendingMinterInstance | undefined
baseMinterMessages: BaseMinterInstance | undefined
openEditionMinterMessages: OpenEditionMinterInstance | undefined
minterType: MinterType
sg721Type: Sg721Type
}
@ -47,6 +49,7 @@ export const CollectionActions = ({
minterContractAddress,
vendingMinterMessages,
baseMinterMessages,
openEditionMinterMessages,
minterType,
sg721Type,
}: CollectionActionsProps) => {
@ -54,6 +57,7 @@ export const CollectionActions = ({
const [lastTx, setLastTx] = useState('')
const [timestamp, setTimestamp] = useState<Date | undefined>(undefined)
const [endTimestamp, setEndTimestamp] = useState<Date | undefined>(undefined)
const [airdropAllocationArray, setAirdropAllocationArray] = useState<AirdropAllocation[]>([])
const [airdropArray, setAirdropArray] = useState<string[]>([])
const [collectionInfo, setCollectionInfo] = useState<CollectionInfo>()
@ -168,6 +172,7 @@ export const CollectionActions = ({
const showTokenUriField = isEitherType(type, ['mint_token_uri', 'update_token_metadata'])
const showWhitelistField = type === 'set_whitelist'
const showDateField = isEitherType(type, ['update_start_time', 'update_start_trading_time'])
const showEndDateField = type === 'update_end_time'
const showLimitField = type === 'update_per_address_limit'
const showTokenIdField = isEitherType(type, ['transfer', 'mint_for', 'burn', 'update_token_metadata'])
const showNumberOfTokensField = type === 'batch_mint'
@ -197,6 +202,7 @@ export const CollectionActions = ({
const payload: DispatchExecuteArgs = {
whitelist: whitelistState.value,
startTime: timestamp ? (timestamp.getTime() * 1_000_000).toString() : '',
endTime: endTimestamp ? (endTimestamp.getTime() * 1_000_000).toString() : '',
limit: limitState.value,
minterContract: minterContractAddress,
sg721Contract: sg721ContractAddress,
@ -208,6 +214,7 @@ export const CollectionActions = ({
batchNumber: batchNumberState.value,
vendingMinterMessages,
baseMinterMessages,
openEditionMinterMessages,
sg721Messages,
recipient: resolvedRecipientAddress,
recipients: airdropArray,
@ -493,6 +500,11 @@ export const CollectionActions = ({
<InputDateTime minDate={new Date()} onChange={(date) => setTimestamp(date)} value={timestamp} />
</FormControl>
</Conditional>
<Conditional test={showEndDateField}>
<FormControl className="mt-2" htmlId="end-date" title="End Time">
<InputDateTime minDate={new Date()} onChange={(date) => setEndTimestamp(date)} value={endTimestamp} />
</FormControl>
</Conditional>
</div>
<div className="-mt-6">
<div className="relative mb-2">

View File

@ -6,7 +6,7 @@ import { Fragment, useEffect, useState } from 'react'
import { FaChevronDown, FaInfoCircle } from 'react-icons/fa'
import type { ActionListItem } from './actions'
import { BASE_ACTION_LIST, SG721_UPDATABLE_ACTION_LIST, VENDING_ACTION_LIST } from './actions'
import { BASE_ACTION_LIST, OPEN_EDITION_ACTION_LIST, SG721_UPDATABLE_ACTION_LIST, VENDING_ACTION_LIST } from './actions'
export type MinterType = 'base' | 'vending' | 'openEdition'
export type Sg721Type = 'updatable' | 'base'
@ -29,6 +29,9 @@ export const ActionsCombobox = ({ value, onChange, minterType, sg721Type }: Acti
} else if (minterType === 'vending') {
if (sg721Type === 'updatable') SET_ACTION_LIST(VENDING_ACTION_LIST.concat(SG721_UPDATABLE_ACTION_LIST))
else SET_ACTION_LIST(VENDING_ACTION_LIST)
} else if (minterType === 'openEdition') {
if (sg721Type === 'updatable') SET_ACTION_LIST(OPEN_EDITION_ACTION_LIST.concat(SG721_UPDATABLE_ACTION_LIST))
else SET_ACTION_LIST(OPEN_EDITION_ACTION_LIST)
} else SET_ACTION_LIST(VENDING_ACTION_LIST.concat(SG721_UPDATABLE_ACTION_LIST))
}, [minterType, sg721Type])

View File

@ -1,6 +1,6 @@
/* eslint-disable eslint-comments/disable-enable-pair */
import { useBaseMinterContract } from 'contracts/baseMinter'
import { useOpenEditionMinterContract } from 'contracts/openEditionMinter'
import type { CollectionInfo, SG721Instance } from 'contracts/sg721'
import { useSG721Contract } from 'contracts/sg721'
import type { VendingMinterInstance } from 'contracts/vendingMinter'
@ -8,6 +8,7 @@ import { useVendingMinterContract } from 'contracts/vendingMinter'
import type { AirdropAllocation } from 'utils/isValidAccountsFile'
import type { BaseMinterInstance } from '../../../contracts/baseMinter/contract'
import type { OpenEditionMinterInstance } from '../../../contracts/openEditionMinter/contract'
export type ActionType = typeof ACTION_TYPES[number]
@ -21,6 +22,7 @@ export const ACTION_TYPES = [
'batch_mint',
'set_whitelist',
'update_start_time',
'update_end_time',
'update_start_trading_time',
'update_per_address_limit',
'update_collection_info',
@ -197,6 +199,79 @@ export const VENDING_ACTION_LIST: ActionListItem[] = [
},
]
export const OPEN_EDITION_ACTION_LIST: ActionListItem[] = [
{
id: 'update_mint_price',
name: 'Update Mint Price',
description: `Update mint price`,
},
{
id: 'mint_to',
name: 'Mint To',
description: `Mint a token to a user`,
},
{
id: 'batch_mint',
name: 'Batch Mint To',
description: `Mint multiple tokens to a user`,
},
{
id: 'update_start_time',
name: 'Update Minting Start Time',
description: `Update the start time for minting`,
},
{
id: 'update_end_time',
name: 'Update Minting End Time',
description: `Update the end time for minting`,
},
{
id: 'update_start_trading_time',
name: 'Update Trading Start Time',
description: `Update start time for trading`,
},
{
id: 'update_per_address_limit',
name: 'Update Tokens Per Address Limit',
description: `Update token per address limit`,
},
{
id: 'update_collection_info',
name: 'Update Collection Info',
description: `Update Collection Info`,
},
{
id: 'freeze_collection_info',
name: 'Freeze Collection Info',
description: `Freeze collection info to prevent further updates`,
},
{
id: 'transfer',
name: 'Transfer Tokens',
description: `Transfer tokens from one address to another`,
},
{
id: 'batch_transfer',
name: 'Batch Transfer Tokens',
description: `Transfer a list of tokens to a recipient`,
},
{
id: 'burn',
name: 'Burn Token',
description: `Burn a specified token from the collection`,
},
{
id: 'batch_burn',
name: 'Batch Burn Tokens',
description: `Burn a list of tokens from the collection`,
},
{
id: 'airdrop',
name: 'Airdrop Tokens',
description: 'Airdrop tokens to given addresses',
},
]
export const SG721_UPDATABLE_ACTION_LIST: ActionListItem[] = [
{
id: 'update_token_metadata',
@ -231,6 +306,7 @@ export interface DispatchExecuteArgs {
sg721Contract: string
vendingMinterMessages?: VendingMinterInstance
baseMinterMessages?: BaseMinterInstance
openEditionMinterMessages?: OpenEditionMinterInstance
sg721Messages?: SG721Instance
txSigner: string
type: string | undefined
@ -241,6 +317,7 @@ export interface DispatchExecuteArgs {
batchNumber: number
whitelist: string
startTime: string | undefined
endTime: string | undefined
limit: number
tokenIds: string
recipients: string[]
@ -250,8 +327,8 @@ export interface DispatchExecuteArgs {
}
export const dispatchExecute = async (args: DispatchExecuteArgs) => {
const { vendingMinterMessages, baseMinterMessages, sg721Messages, txSigner } = args
if (!vendingMinterMessages || !baseMinterMessages || !sg721Messages) {
const { vendingMinterMessages, baseMinterMessages, openEditionMinterMessages, sg721Messages, txSigner } = args
if (!vendingMinterMessages || !baseMinterMessages || !openEditionMinterMessages || !sg721Messages) {
throw new Error('Cannot execute actions')
}
switch (args.type) {
@ -282,6 +359,9 @@ export const dispatchExecute = async (args: DispatchExecuteArgs) => {
case 'update_start_time': {
return vendingMinterMessages.updateStartTime(txSigner, args.startTime as string)
}
case 'update_end_time': {
return openEditionMinterMessages.updateEndTime(txSigner, args.endTime as string)
}
case 'update_start_trading_time': {
return vendingMinterMessages.updateStartTradingTime(txSigner, args.startTime)
}
@ -346,6 +426,8 @@ export const previewExecutePayload = (args: DispatchExecuteArgs) => {
const { messages: sg721Messages } = useSG721Contract()
// eslint-disable-next-line react-hooks/rules-of-hooks
const { messages: baseMinterMessages } = useBaseMinterContract()
// eslint-disable-next-line react-hooks/rules-of-hooks
const { messages: openEditionMinterMessages } = useOpenEditionMinterContract()
const { minterContract, sg721Contract } = args
switch (args.type) {
case 'mint_token_uri': {
@ -375,6 +457,9 @@ export const previewExecutePayload = (args: DispatchExecuteArgs) => {
case 'update_start_time': {
return vendingMinterMessages(minterContract)?.updateStartTime(args.startTime as string)
}
case 'update_end_time': {
return openEditionMinterMessages(minterContract)?.updateEndTime(args.endTime as string)
}
case 'update_start_trading_time': {
return vendingMinterMessages(minterContract)?.updateStartTradingTime(args.startTime as string)
}

View File

@ -19,7 +19,12 @@ import { links } from 'utils/links'
import type { MinterType, Sg721Type } from '../../components/collections/actions/Combobox'
const CollectionActionsPage: NextPage = () => {
const { baseMinter: baseMinterContract, vendingMinter: vendingMinterContract, sg721: sg721Contract } = useContracts()
const {
baseMinter: baseMinterContract,
vendingMinter: vendingMinterContract,
openEditionMinter: openEditionMinterContract,
sg721: sg721Contract,
} = useContracts()
const wallet = useWallet()
const [action, setAction] = useState<boolean>(false)
@ -51,6 +56,11 @@ const CollectionActionsPage: NextPage = () => {
() => baseMinterContract?.use(minterContractState.value),
[baseMinterContract, minterContractState.value],
)
const openEditionMinterMessages = useMemo(
() => openEditionMinterContract?.use(minterContractState.value),
[openEditionMinterContract, minterContractState.value],
)
const sg721Messages = useMemo(
() => sg721Contract?.use(sg721ContractState.value),
[sg721Contract, sg721ContractState.value],
@ -105,6 +115,8 @@ const CollectionActionsPage: NextPage = () => {
.then((contract) => {
if (contract?.includes('sg-base-minter')) {
setMinterType('base')
} else if (contract?.includes('open-edition')) {
setMinterType('openEdition')
} else {
setMinterType('vending')
}
@ -214,6 +226,7 @@ const CollectionActionsPage: NextPage = () => {
baseMinterMessages={baseMinterMessages}
minterContractAddress={minterContractState.value}
minterType={minterType}
openEditionMinterMessages={openEditionMinterMessages}
sg721ContractAddress={sg721ContractState.value}
sg721Messages={sg721Messages}
sg721Type={sg721Type}