diff --git a/components/collections/actions/Action.tsx b/components/collections/actions/Action.tsx index 9e91783..f664a68 100644 --- a/components/collections/actions/Action.tsx +++ b/components/collections/actions/Action.tsx @@ -12,6 +12,7 @@ import { AddressInput, NumberInput } from 'components/forms/FormInput' import { useInputState, useNumberInputState } from 'components/forms/FormInput.hooks' import { InputDateTime } from 'components/InputDateTime' import { JsonPreview } from 'components/JsonPreview' +import { Tooltip } from 'components/Tooltip' import { TransactionHash } from 'components/TransactionHash' import { useWallet } from 'contexts/wallet' import type { BaseMinterInstance } from 'contracts/baseMinter' @@ -63,6 +64,7 @@ export const CollectionActions = ({ const [collectionInfo, setCollectionInfo] = useState() const [explicitContent, setExplicitContent] = useState(undefined) const [resolvedRecipientAddress, setResolvedRecipientAddress] = useState('') + const [jsonExtensions, setJsonExtensions] = useState(false) const actionComboboxState = useActionsComboboxState() const type = actionComboboxState.value?.id @@ -228,6 +230,7 @@ export const CollectionActions = ({ ? baseURIState.value.trim().slice(0, -1) : baseURIState.value.trim(), collectionInfo, + jsonExtensions, } const resolveRecipientAddress = async () => { await resolveAddress(recipientState.value.trim(), wallet).then((resolvedAddress) => { @@ -507,6 +510,26 @@ export const CollectionActions = ({ setEndTimestamp(date)} value={endTimestamp} /> + + +
+ +
+
+
diff --git a/components/collections/actions/actions.ts b/components/collections/actions/actions.ts index a1803c8..2d7c850 100644 --- a/components/collections/actions/actions.ts +++ b/components/collections/actions/actions.ts @@ -327,6 +327,7 @@ export interface DispatchExecuteArgs { tokenRecipients: AirdropAllocation[] collectionInfo: CollectionInfo | undefined baseUri: string + jsonExtensions: boolean } export const dispatchExecute = async (args: DispatchExecuteArgs) => { @@ -387,7 +388,7 @@ export const dispatchExecute = async (args: DispatchExecuteArgs) => { return sg721Messages.updateTokenMetadata(args.tokenId.toString(), args.tokenUri) } case 'batch_update_token_metadata': { - return sg721Messages.batchUpdateTokenMetadata(args.tokenIds, args.baseUri) + return sg721Messages.batchUpdateTokenMetadata(args.tokenIds, args.baseUri, args.jsonExtensions) } case 'freeze_token_metadata': { return sg721Messages.freezeTokenMetadata() @@ -494,7 +495,7 @@ export const previewExecutePayload = (args: DispatchExecuteArgs) => { return sg721Messages(sg721Contract)?.updateTokenMetadata(args.tokenId.toString(), args.tokenUri) } case 'batch_update_token_metadata': { - return sg721Messages(sg721Contract)?.batchUpdateTokenMetadata(args.tokenIds, args.baseUri) + return sg721Messages(sg721Contract)?.batchUpdateTokenMetadata(args.tokenIds, args.baseUri, args.jsonExtensions) } case 'freeze_token_metadata': { return sg721Messages(sg721Contract)?.freezeTokenMetadata() diff --git a/contracts/sg721/contract.ts b/contracts/sg721/contract.ts index ec2f880..91a7b38 100644 --- a/contracts/sg721/contract.ts +++ b/contracts/sg721/contract.ts @@ -87,7 +87,7 @@ export interface SG721Instance { batchBurn: (tokenIds: string) => Promise batchTransfer: (recipient: string, tokenIds: string) => Promise updateTokenMetadata: (tokenId: string, tokenURI: string) => Promise - batchUpdateTokenMetadata: (tokenIds: string, tokenURI: string) => Promise + batchUpdateTokenMetadata: (tokenIds: string, tokenURI: string, jsonExtensions: boolean) => Promise freezeTokenMetadata: () => Promise enableUpdatable: () => Promise } @@ -106,7 +106,11 @@ export interface Sg721Messages { updateCollectionInfo: (collectionInfo: CollectionInfo) => UpdateCollectionInfoMessage freezeCollectionInfo: () => FreezeCollectionInfoMessage updateTokenMetadata: (tokenId: string, tokenURI: string) => UpdateTokenMetadataMessage - batchUpdateTokenMetadata: (tokenIds: string, tokenURI: string) => BatchUpdateTokenMetadataMessage + batchUpdateTokenMetadata: ( + tokenIds: string, + tokenURI: string, + jsonExtensions: boolean, + ) => BatchUpdateTokenMetadataMessage freezeTokenMetadata: () => FreezeTokenMetadataMessage enableUpdatable: () => EnableUpdatableMessage } @@ -611,13 +615,20 @@ export const SG721 = (client: SigningCosmWasmClient, txSigner: string): SG721Con return res.transactionHash } - const batchUpdateTokenMetadata = async (tokenIds: string, baseURI: string): Promise => { + const batchUpdateTokenMetadata = async ( + tokenIds: string, + baseURI: string, + jsonExtensions: boolean, + ): Promise => { const executeContractMsgs: MsgExecuteContractEncodeObject[] = [] if (tokenIds.includes(':')) { const [start, end] = tokenIds.split(':').map(Number) for (let i = start; i <= end; i++) { const msg = { - update_token_metadata: { token_id: i.toString(), token_uri: `${baseURI}/${i}` }, + update_token_metadata: { + token_id: i.toString(), + token_uri: `${baseURI}/${i}${jsonExtensions ? '.json' : ''}`, + }, } const executeContractMsg: MsgExecuteContractEncodeObject = { typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract', @@ -634,7 +645,10 @@ export const SG721 = (client: SigningCosmWasmClient, txSigner: string): SG721Con const tokenNumbers = tokenIds.split(',').map(Number) for (let i = 0; i < tokenNumbers.length; i++) { const msg = { - update_token_metadata: { token_id: tokenNumbers[i].toString(), token_uri: `${baseURI}/${tokenNumbers[i]}` }, + update_token_metadata: { + token_id: tokenNumbers[i].toString(), + token_uri: `${baseURI}/${tokenNumbers[i]}${jsonExtensions ? '.json' : ''}`, + }, } const executeContractMsg: MsgExecuteContractEncodeObject = { typeUrl: '/cosmwasm.wasm.v1.MsgExecuteContract', @@ -936,20 +950,30 @@ export const SG721 = (client: SigningCosmWasmClient, txSigner: string): SG721Con } } - const batchUpdateTokenMetadata = (tokenIds: string, baseURI: string): BatchUpdateTokenMetadataMessage => { + const batchUpdateTokenMetadata = ( + tokenIds: string, + baseURI: string, + jsonExtensions: boolean, + ): BatchUpdateTokenMetadataMessage => { const msg: Record[] = [] if (tokenIds.includes(':')) { const [start, end] = tokenIds.split(':').map(Number) for (let i = start; i <= end; i++) { msg.push({ - update_token_metadata: { token_id: i.toString(), token_uri: `${baseURI}/${i}` }, + update_token_metadata: { + token_id: i.toString(), + token_uri: `${baseURI}/${i}${jsonExtensions ? '.json' : ''}`, + }, }) } } else { const tokenNumbers = tokenIds.split(',').map(Number) for (let i = 0; i < tokenNumbers.length; i++) { msg.push({ - update_token_metadata: { token_id: tokenNumbers[i].toString(), token_uri: `${baseURI}/${tokenNumbers[i]}` }, + update_token_metadata: { + token_id: tokenNumbers[i].toString(), + token_uri: `${baseURI}/${tokenNumbers[i]}${jsonExtensions ? '.json' : ''}`, + }, }) } }