diff --git a/src/modules/[chain]/nft/index.vue b/src/modules/[chain]/nft/index.vue
new file mode 100644
index 00000000..bf8fc910
--- /dev/null
+++ b/src/modules/[chain]/nft/index.vue
@@ -0,0 +1,8 @@
+
+
+
+
+ NFT
+
diff --git a/src/modules/[chain]/nft/nftStore.ts b/src/modules/[chain]/nft/nftStore.ts
new file mode 100644
index 00000000..c54b006e
--- /dev/null
+++ b/src/modules/[chain]/nft/nftStore.ts
@@ -0,0 +1,26 @@
+
+import { defineStore } from 'pinia';
+
+import {useBlockchain} from '@/stores'
+import { DEFAULT, NFTRestClient, type PageinatedClasses, type PageinatedNFTs } from './types';
+
+export const useNFTModule = defineStore('module-nft', {
+ state: () => {
+ return {
+ nfts: {} as PageinatedNFTs,
+ classes: {} as PageinatedClasses,
+ };
+ },
+ getters: {
+ chain() {
+ return useBlockchain()
+ },
+ client() {
+ const client = new NFTRestClient(this.chain.rest, DEFAULT)
+ return client
+ }
+ },
+ actions: {
+
+ }
+});
diff --git a/src/modules/[chain]/nft/types.ts b/src/modules/[chain]/nft/types.ts
new file mode 100644
index 00000000..044a7b7c
--- /dev/null
+++ b/src/modules/[chain]/nft/types.ts
@@ -0,0 +1,108 @@
+
+import { BaseRestClient } from '@/libs/client';
+import { adapter, type AbstractRegistry, type Request } from '@/libs/registry';
+import { PageRequest, type PaginatedResponse } from '@/types';
+
+export interface Classes {
+ id: string,
+ name: string,
+ symbol: string,
+ description: string,
+ uri: string,
+ uri_hash: string,
+ data: {
+ type_url: string,
+ value: string
+ }
+}
+
+export interface NFT {
+ class_id: string,
+ id: string,
+ uri: string,
+ uri_hash: string,
+ data: {
+ type_url: string,
+ value: string
+ }
+ }
+
+export interface Balance {
+ amount: string,
+}
+
+export interface PageinatedClasses extends PaginatedResponse {
+ classes: Classes[],
+}
+
+export interface PageinatedNFTs extends PaginatedResponse {
+ nfts: NFT[],
+}
+
+export interface NFTRequestRegistry extends AbstractRegistry {
+ nft_classes: Request;
+ nft_classes_class_id: Request;
+ nft_supply_class_id: Request;
+ nft_classes_nfts: Request;
+ nft_classes_nfts_class_id_nft_id: Request;
+ nft_classes_nfts_class_id_nft_id_owner: Request<{
+ owner: string
+ }>;
+ nft_balance_owner: Request;
+}
+
+export const DEFAULT: NFTRequestRegistry = {
+ nft_classes: {
+ url: '/cosmos/nft/v1beta1/classes',
+ adapter,
+ },
+ nft_classes_class_id: {
+ url: '/cosmos/nft/v1beta1/classes/{class_id}',
+ adapter,
+ },
+ nft_supply_class_id: {
+ url: '/cosmos/nft/v1beta1/supply/{class_id}',
+ adapter,
+ },
+ nft_classes_nfts: {
+ url: '/cosmos/nft/v1beta1/nfts',
+ adapter,
+ },
+ nft_classes_nfts_class_id_nft_id: {
+ url: '/cosmos/nft/v1beta1/{class_id}/{nft_id}',
+ adapter,
+ },
+ nft_classes_nfts_class_id_nft_id_owner: {
+ url: '/cosmos/nft/v1beta1/owner/{class_id}/{nft_id}',
+ adapter,
+ },
+ nft_balance_owner: {
+ url: '/cosmos/nft/v1beta1/balance/{owner}/{class_id}',
+ adapter,
+ }
+};
+
+export class NFTRestClient extends BaseRestClient {
+ getClasses(pr?: PageRequest) {
+ if(!pr) pr = new PageRequest()
+ const query = `?${pr.toQueryString()}`
+ return this.request(this.registry.nft_classes, {}, query);
+ }
+ getClassesById(class_id: string) {
+ return this.request(this.registry.nft_classes_class_id, { class_id }); // `code_id` is a param in above url
+ }
+ getNFTs(class_id: string, id: string, page?: PageRequest) {
+ if(!page) page = new PageRequest()
+ const query = `?${page.toQueryString()}`
+ return this.request(this.registry.nft_classes_nfts_class_id_nft_id, { class_id, id }, query);
+ }
+ getNFTOwner(class_id: string, id: string) {
+ return this.request(this.registry.nft_classes_nfts_class_id_nft_id_owner, {class_id, id});
+ }
+ getNFTSupply(class_id: string) {
+ return this.request(this.registry.nft_supply_class_id, { class_id });
+ }
+ getBalanceOfNFT(class_id: string, owner: string) {
+ return this.request(this.registry.nft_balance_owner, { class_id, owner });
+ }
+ }
\ No newline at end of file
diff --git a/src/plugins/i18n/locales/en.json b/src/plugins/i18n/locales/en.json
index 82fcd77f..0dfed947 100644
--- a/src/plugins/i18n/locales/en.json
+++ b/src/plugins/i18n/locales/en.json
@@ -10,6 +10,7 @@
"cosmwasm": "Cosmwasm",
"widget": "Widgets",
"ibc": "IBC",
+ "nft": "NFT",
"consensus": "Consensus",
"supply": "Supply",
"account": "Accounts",