= ({
label="Choose another file"
type={ButtonType.Secondary}
onClick={() => !disabled && inputFileRef?.current?.click()}
- className="text-sm !py-2 px-6 rounded-[10px] font-semibold w-[160px] !bg-transparent group-hover:opacity-50"
+ className="text-sm !py-2 px-6 rounded-[10px] font-medium w-[160px] !bg-transparent group-hover:opacity-50"
/>
diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx
index 29a65cc..5fe7eae 100644
--- a/src/components/Layout/index.tsx
+++ b/src/components/Layout/index.tsx
@@ -50,6 +50,8 @@ import { isBrowser } from "@/helpers/isBrowser";
import { ConfirmClawbackModal } from "../ConfirmClawbackModal";
import { ConfirmUpdateDexUnifiedRefAmountModal } from "../ConfirmUpdateUnifiedRefAmountModal";
import { ConfirmUpdateDexWhitelistedDenomsModal } from "../ConfirmUpdateWhitelistedDenomsModal";
+import { EditNFTModal } from "../EditNFTModal";
+import { ConfirmEditNFTDataModal } from "../ConfirmEditNFTDataModal";
interface LayoutProps {
children: React.ReactNode;
@@ -176,6 +178,8 @@ export const Layout: React.FC = ({ children }) => {
+
+
>
);
default:
diff --git a/src/components/SuccessIssueFTModal/index.tsx b/src/components/SuccessIssueFTModal/index.tsx
index 4b9d4c1..09f4c9d 100644
--- a/src/components/SuccessIssueFTModal/index.tsx
+++ b/src/components/SuccessIssueFTModal/index.tsx
@@ -7,7 +7,7 @@ import { ModalInfoRow } from "../ModalInfoRow";
import { Button } from "../Button";
import { setIsSuccessIssueFTModalOpen } from "@/features/general/generalSlice";
import { setIssuedToken } from "@/features/currencies/currenciesSlice";
-import { Feature } from "coreum-js";
+import { Feature } from "coreum-js-nightly";
import { Decimal } from "../Decimal";
import { convertSubunitToUnit } from "@/helpers/convertUnitToSubunit";
import { shortenAddress } from "@/helpers/shortenAddress";
diff --git a/src/components/SuccessIssueNFTModal/index.tsx b/src/components/SuccessIssueNFTModal/index.tsx
index 3970ad2..f18197b 100644
--- a/src/components/SuccessIssueNFTModal/index.tsx
+++ b/src/components/SuccessIssueNFTModal/index.tsx
@@ -6,7 +6,7 @@ import { useCallback, useMemo } from "react";
import { ModalInfoRow } from "../ModalInfoRow";
import { Button } from "../Button";
import { setIsSuccessIssueNFTModalOpen } from "@/features/general/generalSlice";
-import { ClassFeature } from "coreum-js";
+import { ClassFeature } from "coreum-js-nightly";
import { setIssuedNFTCollection } from "@/features/nft/nftSlice";
import { shortenAddress } from "@/helpers/shortenAddress";
import { Input } from "../Input";
diff --git a/src/components/ViewNFTCollectionModal/index.tsx b/src/components/ViewNFTCollectionModal/index.tsx
index 4fcc303..b963b3d 100644
--- a/src/components/ViewNFTCollectionModal/index.tsx
+++ b/src/components/ViewNFTCollectionModal/index.tsx
@@ -3,7 +3,7 @@
import { useCallback, useMemo, useState } from "react";
import { Modal } from "../Modal";
import { useAppDispatch, useAppSelector } from "@/store/hooks";
-import { setIsBurnNFTModalOpen, setIsDeWhitelistNFTModalOpen, setIsFreezeNFTModalOpen, setIsNFTCollectionViewModalOpen, setIsUnfreezeNFTModalOpen, setIsWhitelistNFTModalOpen } from "@/features/general/generalSlice";
+import { setIsBurnNFTModalOpen, setIsDeWhitelistNFTModalOpen, setIsEditNFTModalOpen, setIsFreezeNFTModalOpen, setIsNFTCollectionViewModalOpen, setIsUnfreezeNFTModalOpen, setIsWhitelistNFTModalOpen } from "@/features/general/generalSlice";
import { NFTItem } from "../NFTItem";
import { ActionItem, GeneralIconType, NFT } from "@/shared/types";
import { GeneralIcon } from "@/assets/GeneralIcon";
@@ -79,6 +79,12 @@ export const ViewNFTCollectionModal = () => {
dispatch(setIsNFTCollectionViewModalOpen(false));
}, []);
+ const onEditClick = useCallback((nft: NFT) => {
+ dispatch(setSelectedNFTSend(nft));
+ dispatch(setIsEditNFTModalOpen(true));
+ dispatch(setIsNFTCollectionViewModalOpen(false));
+ }, []);
+
const renderContent = useMemo(() => {
if (isNFTItemsLoading) {
return (
@@ -105,6 +111,12 @@ export const ViewNFTCollectionModal = () => {
icon: ,
onClick: () => onSendClick(item),
});
+ items.push({
+ id: 'edit',
+ label: 'Edit',
+ icon: ,
+ onClick: () => onEditClick(item),
+ });
}
if (isFreezing) {
@@ -171,7 +183,22 @@ export const ViewNFTCollectionModal = () => {
);
- }, [isNFTItemsLoading, currentNFTItems, selectedNFT?.id, selectedNFTClass?.features, selectedNFTClass?.id, ownedNFTItems, onSendClick, onFreezeClick, onUnfreezeClick, onBurnClick, onWhitelistClick, onDeWhitelistClick, onNFTClick]);
+ }, [
+ isNFTItemsLoading,
+ currentNFTItems,
+ selectedNFT?.id,
+ selectedNFTClass?.features,
+ selectedNFTClass?.id,
+ ownedNFTItems,
+ onSendClick,
+ onFreezeClick,
+ onUnfreezeClick,
+ onBurnClick,
+ onWhitelistClick,
+ onDeWhitelistClick,
+ onNFTClick,
+ onEditClick,
+ ]);
return (
{
uriHash,
features: featuresToApply,
royaltyRate: parseFloatToRoyaltyRate(royalties),
+ data: undefined,
});
const txFee = await getTxFee([issueNFTMsg]);
diff --git a/src/containers/NonFungibleTokenSend/index.tsx b/src/containers/NonFungibleTokenSend/index.tsx
index 7991a24..5ae36d5 100644
--- a/src/containers/NonFungibleTokenSend/index.tsx
+++ b/src/containers/NonFungibleTokenSend/index.tsx
@@ -16,7 +16,7 @@ import { validateAddress } from "@/helpers/validateAddress";
import { useEstimateTxGasFee } from "@/hooks/useEstimateTxGasFee";
import { ButtonType, ButtonIconType, ChainInfo, GeneralIconType, AlertType, NFT as NFTType } from "@/shared/types";
import { useAppDispatch, useAppSelector } from "@/store/hooks";
-import { NFT } from "coreum-js";
+import { NFT } from "coreum-js-nightly";
import { useCallback, useEffect, useMemo, useState } from "react";
export const NonFungibleTokenSend = () => {
diff --git a/src/features/currencies/currenciesSlice.ts b/src/features/currencies/currenciesSlice.ts
index 915fe53..4ca11e3 100644
--- a/src/features/currencies/currenciesSlice.ts
+++ b/src/features/currencies/currenciesSlice.ts
@@ -3,7 +3,7 @@ import { AssetRegistry, Network, Token } from '@/shared/types';
import { Coin } from '@cosmjs/proto-signing';
import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';
import axios, { AxiosResponse } from 'axios';
-import { Feature } from 'coreum-js';
+import { Feature } from "coreum-js-nightly";
interface FetchCurrenciesByAccountArgs {
account: string;
diff --git a/src/features/general/generalSlice.ts b/src/features/general/generalSlice.ts
index e39db8f..a4a4745 100644
--- a/src/features/general/generalSlice.ts
+++ b/src/features/general/generalSlice.ts
@@ -25,6 +25,8 @@ export interface GeneralState {
isConfirmBurnModalOpen: boolean;
isConfirmUpdateDexUnifiedRefAmountOpen: boolean;
isConfirmUpdateDexWhitelistedDenomsOpen: boolean;
+ isEditNFTModalOpen: boolean;
+ isConfirmEditNFTModalOpen: boolean;
isSelectNFTModalOpen: boolean;
isNFTCollectionViewModalOpen: boolean;
isNFTMintModalOpen: boolean;
@@ -64,6 +66,8 @@ export const initialGeneralState: GeneralState = {
isConfirmBurnModalOpen: false,
isConfirmUpdateDexUnifiedRefAmountOpen: false,
isConfirmUpdateDexWhitelistedDenomsOpen: false,
+ isEditNFTModalOpen: false,
+ isConfirmEditNFTModalOpen: false,
isSelectNFTModalOpen: false,
isNFTCollectionViewModalOpen: false,
isNFTMintModalOpen: false,
@@ -200,6 +204,12 @@ const generalSlice = createSlice({
setIsDisclaimerModalOpen(state, action: PayloadAction) {
state.isDisclaimerModalOpen = action.payload;
},
+ setIsEditNFTModalOpen(state, action: PayloadAction) {
+ state.isEditNFTModalOpen = action.payload;
+ },
+ setIsConfirmEditNFTModalOpen(state, action: PayloadAction) {
+ state.isConfirmEditNFTModalOpen = action.payload;
+ },
},
});
@@ -239,6 +249,8 @@ export const {
setIsDisclaimerModalOpen,
setIsConfirmUpdateDexUnifiedRefAmountOpen,
setIsConfirmUpdateDexWhitelistedDenomsOpen,
+ setIsEditNFTModalOpen,
+ setIsConfirmEditNFTModalOpen,
} = generalSlice.actions;
export const generalReducer = generalSlice.reducer;
export default generalSlice.reducer;
diff --git a/src/features/nft/nftSlice.ts b/src/features/nft/nftSlice.ts
index 4f387ee..4511968 100644
--- a/src/features/nft/nftSlice.ts
+++ b/src/features/nft/nftSlice.ts
@@ -1,7 +1,7 @@
import { Network, NFT, NFTClass } from '@/shared/types';
import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit';
import axios, { AxiosResponse } from 'axios';
-import { ClassFeature } from 'coreum-js';
+import { ClassFeature } from "coreum-js-nightly";
interface FetchIssuedCollectionsArgs {
account: string;
@@ -267,6 +267,7 @@ export interface NFTsState {
shouldRefetchNFTItems: boolean;
issuedNFTCollection: IssuedNFTCollectionType | null;
deWhitelistAccount: string;
+ editNFTData: string;
}
export const initialNFTsState: NFTsState = {
@@ -289,6 +290,7 @@ export const initialNFTsState: NFTsState = {
shouldRefetchNFTItems: false,
issuedNFTCollection: null,
deWhitelistAccount: '',
+ editNFTData: '',
};
const nftsSlice = createSlice({
@@ -352,6 +354,9 @@ const nftsSlice = createSlice({
setDeWhitelistAccount(state, action: PayloadAction) {
state.deWhitelistAccount = action.payload;
},
+ setEditNFTData(state, action: PayloadAction) {
+ state.editNFTData = action.payload;
+ },
resetNFTsState(state) {
// state.isLoading = false;
state.collections = [];
@@ -424,6 +429,7 @@ export const {
setIssuedNFTCollection,
setDeWhitelistAccount,
resetNFTsState,
+ setEditNFTData,
} = nftsSlice.actions;
export const nftsReducer = nftsSlice.reducer;
export default nftsSlice.reducer;
diff --git a/src/helpers/convertStringToAny.ts b/src/helpers/convertStringToAny.ts
new file mode 100644
index 0000000..2edf70b
--- /dev/null
+++ b/src/helpers/convertStringToAny.ts
@@ -0,0 +1,35 @@
+import { DataBytes, DataDynamic } from "coreum-js-nightly/dist/main/coreum/asset/nft/v1/types";
+import { Any } from 'google-protobuf/google/protobuf/any_pb';
+
+export const convertStringToAny = (message: string): Any => {
+ const formattedValueOfData = btoa(message);
+ const dataBytesMessage = DataBytes.fromJSON({ Data: formattedValueOfData });
+ const dataBytesBinary = DataBytes.encode(dataBytesMessage).finish();
+
+ const formattedAnyDataValue = new Any();
+ formattedAnyDataValue.setTypeUrl('/coreum.asset.nft.v1.DataBytes');
+ formattedAnyDataValue.setValue(dataBytesBinary);
+
+ return formattedAnyDataValue;
+};
+
+export const convertStringToUint8Array = (message: string) => {
+ const formattedValueOfData = btoa(message);
+ const dataBytesMessage = DataBytes.fromJSON({ Data: formattedValueOfData });
+ const dataBytesBinary = DataBytes.encode(dataBytesMessage).finish();
+
+ return dataBytesBinary;
+};
+
+export const convertStringToDataDynamic = (items: any[]): Any => {
+ const dataBytesMessage = DataDynamic.fromJSON({
+ items: items,
+ });
+ const dataDynamicBinary = DataDynamic.encode(dataBytesMessage).finish();
+
+ const formattedAnyDataValue = new Any();
+ formattedAnyDataValue.setTypeUrl('/coreum.asset.nft.v1.DataDynamic');
+ formattedAnyDataValue.setValue(dataDynamicBinary);
+
+ return formattedAnyDataValue;
+};
diff --git a/src/hooks/useEstimateTxGasFee.ts b/src/hooks/useEstimateTxGasFee.ts
index 7926dd6..c9ed4d5 100644
--- a/src/hooks/useEstimateTxGasFee.ts
+++ b/src/hooks/useEstimateTxGasFee.ts
@@ -12,7 +12,7 @@ import {
} from "@cosmjs/stargate";
import { QueryClientImpl as FeeModelClient } from "@/lib/query";
import Big from "big.js";
-import { coreumRegistry, cosmwasmRegistry } from 'coreum-js';
+import { coreumRegistry, cosmwasmRegistry } from "coreum-js-nightly";
const registryTypes = [
...defaultRegistryTypes,
diff --git a/src/shared/types.ts b/src/shared/types.ts
index 2737a8f..a354adc 100644
--- a/src/shared/types.ts
+++ b/src/shared/types.ts
@@ -62,6 +62,7 @@ export enum GeneralIconType {
Unfreeze = 'unfreeze',
Whitelist = 'whitelist',
File = 'file',
+ Edit = 'edit',
};
export enum TabItemType {
@@ -223,6 +224,7 @@ export enum ConfirmationModalImageType {
Clawback = 'clawback',
DEXWhitelistedDenoms = 'dex_whitelisted_denoms',
DEXUnifiedRefAmountChange = 'dex_unified_ref_amount_change',
+ Edit = 'edit',
}
export enum AlertType {