From 6b89a6021631d398952f94b57261f86b5c4ba99e Mon Sep 17 00:00:00 2001 From: Serkan Reis Date: Sat, 17 Jun 2023 11:01:32 +0300 Subject: [PATCH] Include open edition minter actions in Collection Actions > Actions --- components/collections/actions/Action.tsx | 12 +++ components/collections/actions/Combobox.tsx | 5 +- components/collections/actions/actions.ts | 91 ++++++++++++++++++++- pages/collections/actions.tsx | 15 +++- 4 files changed, 118 insertions(+), 5 deletions(-) diff --git a/components/collections/actions/Action.tsx b/components/collections/actions/Action.tsx index 7c509ee..5f38fb5 100644 --- a/components/collections/actions/Action.tsx +++ b/components/collections/actions/Action.tsx @@ -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(undefined) + const [endTimestamp, setEndTimestamp] = useState(undefined) const [airdropAllocationArray, setAirdropAllocationArray] = useState([]) const [airdropArray, setAirdropArray] = useState([]) const [collectionInfo, setCollectionInfo] = useState() @@ -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 = ({ setTimestamp(date)} value={timestamp} /> + + + setEndTimestamp(date)} value={endTimestamp} /> + +
diff --git a/components/collections/actions/Combobox.tsx b/components/collections/actions/Combobox.tsx index 733c703..f79fdc1 100644 --- a/components/collections/actions/Combobox.tsx +++ b/components/collections/actions/Combobox.tsx @@ -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]) diff --git a/components/collections/actions/actions.ts b/components/collections/actions/actions.ts index 9b1a82d..c5cfc54 100644 --- a/components/collections/actions/actions.ts +++ b/components/collections/actions/actions.ts @@ -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) } diff --git a/pages/collections/actions.tsx b/pages/collections/actions.tsx index 061558a..aecc266 100644 --- a/pages/collections/actions.tsx +++ b/pages/collections/actions.tsx @@ -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(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}