diff --git a/apps/composable-nft-renderer-app/app/[chain]/[collection]/[tokenId]/page.tsx b/apps/composable-nft-renderer-app/app/[chain]/[collection]/[tokenId]/page.tsx
index 6ce1cd6..dc6e676 100644
--- a/apps/composable-nft-renderer-app/app/[chain]/[collection]/[tokenId]/page.tsx
+++ b/apps/composable-nft-renderer-app/app/[chain]/[collection]/[tokenId]/page.tsx
@@ -18,7 +18,6 @@ export default function TokenDisplay({
assertIsEvmNetwork(chain);
const searchParams = useSearchParams();
const advancedMode = searchParams.get('advancedMode') === 'true';
- // const emoteMode = searchParams.get('emoteMode') === 'true';
const chainId = getChainIdByNetworkName(chain);
@@ -30,7 +29,6 @@ export default function TokenDisplay({
contractAddress={collection}
tokenId={BigInt(tokenId)}
advancedMode={advancedMode}
- // emoteMode={emoteMode}
loader={}
/>
diff --git a/apps/composable-nft-renderer-app/components/app/providers.tsx b/apps/composable-nft-renderer-app/components/app/providers.tsx
index 0f5209f..c1d377a 100644
--- a/apps/composable-nft-renderer-app/components/app/providers.tsx
+++ b/apps/composable-nft-renderer-app/components/app/providers.tsx
@@ -3,13 +3,36 @@
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { WagmiProvider } from 'components/app/wagmi-provider';
import React from 'react';
+import { RMRKContextProvider } from '@rmrk-team/rmrk-hooks';
+import {
+ NETWORK_CONTACTS_PROPS,
+ RMRKUtilityContracts,
+} from '@rmrk-team/rmrk-evm-utils';
+import { hardhat } from 'wagmi/chains';
const queryClient = new QueryClient();
+// You can pass custom utility contracts to the RMRKContextProvider
+const customUtilityContracts = {
+ [hardhat.id]: {
+ [NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]: '0x00',
+ [NETWORK_CONTACTS_PROPS.RMRKBulkWriter]: '0x00',
+ [NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]: '0x00',
+ },
+} satisfies RMRKUtilityContracts;
+
+const rmrkConfig = {
+ utilityContracts: customUtilityContracts,
+};
+
export const Providers = ({ children }: { children: React.ReactNode }) => {
return (
- {children}
+
+
+ {children}
+
+
);
};
diff --git a/apps/composable-nft-renderer-app/package.json b/apps/composable-nft-renderer-app/package.json
index 6e1ff57..92b5d69 100644
--- a/apps/composable-nft-renderer-app/package.json
+++ b/apps/composable-nft-renderer-app/package.json
@@ -15,6 +15,7 @@
"@rainbow-me/rainbowkit": "^2.0.0-beta.1",
"@rmrk-team/nft-renderer": "workspace:*",
"@rmrk-team/rmrk-evm-utils": "workspace:*",
+ "@rmrk-team/rmrk-hooks": "workspace:*",
"@tanstack/react-query": "^5.17.12",
"lucide-react": "^0.303.0",
"next": "13.4.1",
diff --git a/packages/nft-renderer/src/components/nft-renderer.tsx b/packages/nft-renderer/src/components/nft-renderer.tsx
index 07fdb97..3a176bc 100644
--- a/packages/nft-renderer/src/components/nft-renderer.tsx
+++ b/packages/nft-renderer/src/components/nft-renderer.tsx
@@ -17,29 +17,15 @@ import { usePublicClient, useReadContract } from 'wagmi';
import type { Chain } from 'wagmi/chains';
import '../styles/index.css';
import type { RenderPart } from '../types/types.js';
-// import { sanitizeIpfsUrl } from '../lib/ipfs';
-import { Providers } from './providers.js';
-interface INFTRenderer {
+type NFTRenderer = {
chainId: Chain['id'];
contractAddress: Address;
tokenId: bigint;
advancedMode?: boolean;
loader?: React.ReactNode;
onError?: (error: Error) => void;
-}
-//
-// /**
-// * @description If you have more than 1 NFT to render in the same time, better use `NFTRenderer` rather than current.
-// * Add a `WagmiProvider` and wrap it around `NFTRenderer`s to use it.
-// */
-// export default function NFTRendererWithProvider(props: INFTRenderer) {
-// return (
-//
-//
-//
-// );
-// }
+};
/**
* @description To use this component, make sure you have a WagmiProvider wrapped it
@@ -51,7 +37,7 @@ export function NFTRenderer({
advancedMode,
loader,
onError,
-}: INFTRenderer) {
+}: NFTRenderer) {
const rendererContainerRef = useRef(null);
const tokenIdBigint = BigInt(tokenId);
const network = mapChainIdToNetwork(chainId);
@@ -80,6 +66,7 @@ export function NFTRenderer({
const {
isLoading: isLoadingGetInterfaceSupport,
interfaceSupport: { supports721, supportsEquippable, supportsMultiAsset },
+ isFetching,
} = useGetInterfaceSupport(
{ contractAddress, chainId },
{ enabled: isContract },
@@ -175,12 +162,15 @@ export function NFTRenderer({
const error = errorComposableState || errorPrimaryAsset;
useEffect(() => {
- if (error && onError) onError(error);
+ if (error && onError) {
+ onError(error);
+ }
}, [error, onError]);
useEffect(() => {
- if (chainId === undefined && onError)
+ if (chainId === undefined && onError) {
onError(new Error(`Unsupported chain ${chainId}`));
+ }
}, [chainId, onError]);
if (error) {
diff --git a/packages/rmrk-evm-utils/src/lib/rmrk-contract-addresses.ts b/packages/rmrk-evm-utils/src/lib/rmrk-contract-addresses.ts
index 72d2438..2971e06 100644
--- a/packages/rmrk-evm-utils/src/lib/rmrk-contract-addresses.ts
+++ b/packages/rmrk-evm-utils/src/lib/rmrk-contract-addresses.ts
@@ -1,95 +1,108 @@
-import type { Address } from 'viem';
-import { EVM_NETWORKS } from './chain-mapping.js';
+import type { Address, Chain } from "viem";
+import {
+ astar,
+ base,
+ baseSepolia,
+ hardhat,
+ mainnet,
+ moonbaseAlpha,
+ moonbeam,
+ polygon,
+ polygonMumbai,
+ sepolia,
+} from "wagmi/chains";
export const NETWORK_CONTACTS_PROPS = {
- RMRKEquipRenderUtils: 'RMRKEquipRenderUtils',
- RMRKBulkWriter: 'RMRKBulkWriter',
- RMRKCollectionUtils: 'RMRKCollectionUtils',
+ RMRKEquipRenderUtils: "RMRKEquipRenderUtils",
+ RMRKBulkWriter: "RMRKBulkWriter",
+ RMRKCollectionUtils: "RMRKCollectionUtils",
} as const;
export type NETWORK_CONTACTS_PROPS =
(typeof NETWORK_CONTACTS_PROPS)[keyof typeof NETWORK_CONTACTS_PROPS];
export type NETWRORK_CONTRACT_TYPES = Record;
+export type RMRKUtilityContracts = Record;
+
export const EVM_RMRK_CONTRACTS = {
- [EVM_NETWORKS.moonbeam]: {
+ [moonbeam.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x3bd52D2F911A1243f681d36f1C28bcC6aaa26ef6',
+ "0x3bd52D2F911A1243f681d36f1C28bcC6aaa26ef6",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0xb6ccec23d23b4ed3f623cafbc90cfff32dbf1834',
+ "0xb6ccec23d23b4ed3f623cafbc90cfff32dbf1834",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x244eE3b7F2692191BdA9E9E236e4D2008dd35Ce9',
+ "0x244eE3b7F2692191BdA9E9E236e4D2008dd35Ce9",
},
- [EVM_NETWORKS.ethereum]: {
+ [mainnet.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0xEEDA3E023A8f0Db4E038f2d16d3CF39369D5bA8C',
+ "0xEEDA3E023A8f0Db4E038f2d16d3CF39369D5bA8C",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0xA1bE03772e25001df2B8A3F4FC88d8d3810A285e',
+ "0xA1bE03772e25001df2B8A3F4FC88d8d3810A285e",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x388e1d9b6509ad62c162cd68ccefa84e09aa8280',
+ "0x388e1d9b6509ad62c162cd68ccefa84e09aa8280",
},
- [EVM_NETWORKS.sepolia]: {
+ [sepolia.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x6Ee72618573b4c7484D4Ee46b04f4b271a81e882',
+ "0x6Ee72618573b4c7484D4Ee46b04f4b271a81e882",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0xee04d24462A3952aC8f64F23f5F16e0fFFb5b6CC',
+ "0xee04d24462A3952aC8f64F23f5F16e0fFFb5b6CC",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x3ea5D7985718B6bFa75172Dcd0a79E4c587a6694',
+ "0x3ea5D7985718B6bFa75172Dcd0a79E4c587a6694",
},
- [EVM_NETWORKS.polygon]: {
+ [polygon.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x4e42678e426fdd147a7cf509dd6673b1853e12ed',
+ "0x4e42678e426fdd147a7cf509dd6673b1853e12ed",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0x28F5550315182D8446e9BFa5eD24a7796ee6e2a1',
+ "0x28F5550315182D8446e9BFa5eD24a7796ee6e2a1",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x7cD79daAF8E178Fb4Af7017608633e23587c167e',
+ "0x7cD79daAF8E178Fb4Af7017608633e23587c167e",
},
- [EVM_NETWORKS.polygonMumbai]: {
+ [polygonMumbai.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x5b583eDC4e212Fb737894D2bE44fa7D0805f0774',
+ "0x5b583eDC4e212Fb737894D2bE44fa7D0805f0774",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0xA799A6b45ED9BeE6A9bE436aef29469b9BE0DE3F',
+ "0xA799A6b45ED9BeE6A9bE436aef29469b9BE0DE3F",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0xf57160A562cD87dC786C7388b75BaBAe7EfB60C9',
+ "0xf57160A562cD87dC786C7388b75BaBAe7EfB60C9",
},
- [EVM_NETWORKS.moonbaseAlpha]: {
+ [moonbaseAlpha.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0xC8EBEdb00cBE44da99c3eE1f0c6F5F5BdEf67843',
+ "0xC8EBEdb00cBE44da99c3eE1f0c6F5F5BdEf67843",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0x3d3295D71138078df5F470A22628ec4377416e5d',
+ "0x3d3295D71138078df5F470A22628ec4377416e5d",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x6407d7D24023348Ff660b6F5Fa0F5D644953cf2c',
+ "0x6407d7D24023348Ff660b6F5Fa0F5D644953cf2c",
},
- [EVM_NETWORKS.base]: {
+ [base.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x59E1038E3C94B7EFF7C24B0A2d56DBfc606C1b7C',
+ "0x59E1038E3C94B7EFF7C24B0A2d56DBfc606C1b7C",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0x91d098a91faf61984F965C3A202Ad30747dae275',
+ "0x91d098a91faf61984F965C3A202Ad30747dae275",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0xBa1eA71FF1695C3fe8dfBC774Af30448316E98dc',
+ "0xBa1eA71FF1695C3fe8dfBC774Af30448316E98dc",
},
- [EVM_NETWORKS.baseSepolia]: {
+ [baseSepolia.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x0665ddcACB4064044343fb0DBb368Be3851caB4f',
+ "0x0665ddcACB4064044343fb0DBb368Be3851caB4f",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0xb4F28c86808872f7B368893cbc975F764aD0fdB5',
+ "0xb4F28c86808872f7B368893cbc975F764aD0fdB5",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x4aCFECbA1a5d83a6D8868E55f784b9d5453d1339',
+ "0x4aCFECbA1a5d83a6D8868E55f784b9d5453d1339",
},
- [EVM_NETWORKS.astar]: {
+ [astar.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x248ab178b3342bc843BE7Aacc88eCf3cbf2E25d3',
+ "0x248ab178b3342bc843BE7Aacc88eCf3cbf2E25d3",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0x5B01637FD17c1ac79df13dFF4F7080Fdd4cfEC46',
+ "0x5B01637FD17c1ac79df13dFF4F7080Fdd4cfEC46",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0xCeecc3C73284CfB9d3AB87F8b653D14Bd3b65FeC',
+ "0xCeecc3C73284CfB9d3AB87F8b653D14Bd3b65FeC",
},
- [EVM_NETWORKS.hardhat]: {
+ [hardhat.id]: {
[NETWORK_CONTACTS_PROPS.RMRKEquipRenderUtils]:
- '0x0000000000000000000000000000000000000000',
+ "0x0000000000000000000000000000000000000000",
[NETWORK_CONTACTS_PROPS.RMRKCollectionUtils]:
- '0x0000000000000000000000000000000000000000',
+ "0x0000000000000000000000000000000000000000",
[NETWORK_CONTACTS_PROPS.RMRKBulkWriter]:
- '0x0000000000000000000000000000000000000000',
+ "0x0000000000000000000000000000000000000000",
},
-} as const satisfies Record;
+} as const satisfies RMRKUtilityContracts;
diff --git a/packages/rmrk-evm-utils/src/scripts/get-rmrk-abis.ts b/packages/rmrk-evm-utils/src/scripts/get-rmrk-abis.ts
index 9d7c8d3..df991d1 100644
--- a/packages/rmrk-evm-utils/src/scripts/get-rmrk-abis.ts
+++ b/packages/rmrk-evm-utils/src/scripts/get-rmrk-abis.ts
@@ -3,7 +3,7 @@ import { Abi } from 'abitype/zod';
import 'dotenv/config';
import type { Address } from 'viem';
import { EVM_RMRK_CONTRACTS, NETWORK_CONTACTS_PROPS } from '../index.js';
-import { EVM_NETWORKS } from '../index.js';
+import { base } from 'wagmi/chains';
const BASESCAN_API_URL = 'https://api.basescan.org/api';
@@ -32,12 +32,10 @@ const getRmrkAbi = async (contractName: string, contractAddress: Address) => {
};
const getRmrkAbis = async () => {
- for (const contractName of Object.keys(
- EVM_RMRK_CONTRACTS[EVM_NETWORKS.base],
- )) {
+ for (const contractName of Object.keys(EVM_RMRK_CONTRACTS[base.id])) {
await getRmrkAbi(
contractName,
- EVM_RMRK_CONTRACTS[EVM_NETWORKS.base][
+ EVM_RMRK_CONTRACTS[base.id][
contractName as keyof typeof NETWORK_CONTACTS_PROPS
],
);
diff --git a/packages/rmrk-hooks/package.json b/packages/rmrk-hooks/package.json
index 44a9dde..872f048 100644
--- a/packages/rmrk-hooks/package.json
+++ b/packages/rmrk-hooks/package.json
@@ -45,6 +45,7 @@
"isomorphic-dompurify": "^2.2.0",
"lucide-react": "^0.303.0",
"pixi.js": "^7.2.4",
+ "ramda": "^0.29.1",
"use-image": "^1.1.1"
},
"devDependencies": {
@@ -52,6 +53,7 @@
"@changesets/cli": "^2.27.1",
"@tanstack/react-query": "^5.17.12",
"@types/node": "18.16.9",
+ "@types/ramda": "^0.29.10",
"@types/react": "18.2.33",
"@types/react-dom": "18.2.14",
"@vitejs/plugin-react": "^4.1.0",
diff --git a/packages/rmrk-hooks/src/index.ts b/packages/rmrk-hooks/src/index.ts
index 11ca214..b7d621e 100644
--- a/packages/rmrk-hooks/src/index.ts
+++ b/packages/rmrk-hooks/src/index.ts
@@ -1 +1,2 @@
export * from './lib/hooks/index.js';
+export * from './lib/RMRKContextProvider.js';
diff --git a/packages/rmrk-hooks/src/lib/RMRKContextProvider.tsx b/packages/rmrk-hooks/src/lib/RMRKContextProvider.tsx
new file mode 100644
index 0000000..a76c197
--- /dev/null
+++ b/packages/rmrk-hooks/src/lib/RMRKContextProvider.tsx
@@ -0,0 +1,62 @@
+'use client';
+
+import * as React from 'react';
+import type { RMRKUtilityContracts } from '@rmrk-team/rmrk-evm-utils';
+import { useContext } from 'react';
+import { EVM_RMRK_CONTRACTS } from '@rmrk-team/rmrk-evm-utils';
+import { mergeDeepRight } from 'ramda';
+
+type RMRKConfigInitial = {
+ utilityContracts: RMRKUtilityContracts;
+};
+
+export type RMRKConfig<
+ utilityContracts extends RMRKUtilityContracts = RMRKUtilityContracts,
+> = {
+ utilityContracts: utilityContracts;
+};
+
+export type ResolveRMRKConfig = {
+ config: RMRKConfigInitial extends {
+ config: infer config extends RMRKConfig;
+ }
+ ? config
+ : RMRKConfig;
+};
+
+export type ConfigParameter = {
+ config?: RMRKConfig | config | undefined;
+};
+
+export const RMRKContext = React.createContext(
+ undefined,
+);
+
+export type UseConfigReturnType =
+ config;
+
+export type UseConfigParameters =
+ ConfigParameter;
+
+export function useRMRKConfig<
+ config extends RMRKConfig = ResolveRMRKConfig['config'],
+>(): UseConfigReturnType {
+ const config = useContext(RMRKContext);
+ if (!config) throw new Error('No config found');
+ return config as UseConfigReturnType;
+}
+
+type Props = {
+ config?: RMRKConfig;
+ children?: React.ReactNode;
+};
+
+export const RMRKContextProvider = ({ children, config }: Props) => {
+ const defaultConfig = {
+ utilityContracts: EVM_RMRK_CONTRACTS,
+ } satisfies RMRKConfig;
+ const rmrkConfig = mergeDeepRight(defaultConfig, config || {});
+ return (
+ {children}
+ );
+};
diff --git a/packages/rmrk-hooks/src/lib/hooks/use-get-composable-parts.ts b/packages/rmrk-hooks/src/lib/hooks/use-get-composable-parts.ts
index 6e7d67f..c128534 100644
--- a/packages/rmrk-hooks/src/lib/hooks/use-get-composable-parts.ts
+++ b/packages/rmrk-hooks/src/lib/hooks/use-get-composable-parts.ts
@@ -1,13 +1,12 @@
import {
- EVM_RMRK_CONTRACTS,
RMRKEquipRenderUtils,
RMRKEquippableImpl,
- mapChainIdToNetwork,
} from '@rmrk-team/rmrk-evm-utils';
import type { Address } from 'viem';
import type { Chain } from 'viem';
import { useReadContract } from 'wagmi';
import { useGetInterfaceSupport } from './use-get-interface-support.js';
+import { useRMRKConfig } from '../RMRKContextProvider.js';
type Arguments = {
tokenId: bigint;
@@ -24,8 +23,7 @@ export const useGetComposableParts = (
{ tokenId, address, assetId, chainId }: Arguments,
{ enabled = true }: Options,
) => {
- const network = mapChainIdToNetwork(chainId);
-
+ const config = useRMRKConfig();
const {
isLoading,
interfaceSupport: { supportsEquippable },
@@ -35,7 +33,7 @@ export const useGetComposableParts = (
);
const { data: topAsset, isLoading: isGettingTopAsset } = useReadContract({
- address: EVM_RMRK_CONTRACTS[network].RMRKEquipRenderUtils,
+ address: config.utilityContracts[chainId]?.RMRKEquipRenderUtils,
abi: RMRKEquipRenderUtils,
chainId,
functionName: 'getTopAsset',
@@ -51,7 +49,7 @@ export const useGetComposableParts = (
} = useReadContract({
address:
enabled && !assetId
- ? EVM_RMRK_CONTRACTS[network].RMRKEquipRenderUtils
+ ? config.utilityContracts[chainId]?.RMRKEquipRenderUtils
: undefined,
abi: RMRKEquipRenderUtils,
chainId,
diff --git a/packages/rmrk-hooks/src/lib/hooks/use-get-composed-state.ts b/packages/rmrk-hooks/src/lib/hooks/use-get-composed-state.ts
index b765cd6..b4fc508 100644
--- a/packages/rmrk-hooks/src/lib/hooks/use-get-composed-state.ts
+++ b/packages/rmrk-hooks/src/lib/hooks/use-get-composed-state.ts
@@ -1,12 +1,9 @@
-import {
- EVM_RMRK_CONTRACTS,
- RMRKEquipRenderUtils,
- mapChainIdToNetwork,
-} from '@rmrk-team/rmrk-evm-utils';
+import { RMRKEquipRenderUtils } from '@rmrk-team/rmrk-evm-utils';
import type { Address, Chain } from 'viem';
import { useReadContract } from 'wagmi';
import { useFetchMetadataAndAddToEntities } from './use-fetch-metadata-and-add-to-entities.js';
import { useGetTokenPrimaryAsset } from './use-get-token-primary-asset.js';
+import { useRMRKConfig } from '../RMRKContextProvider.js';
type Arguments = {
assetId?: bigint;
@@ -33,8 +30,8 @@ export const useGetComposedState = (
}: Arguments,
options?: Options,
) => {
- const network = mapChainIdToNetwork(chainId);
const { enabled = true, enabledMetadataFetch = true } = options || {};
+ const config = useRMRKConfig();
const {
primaryAsset,
@@ -62,7 +59,7 @@ export const useGetComposedState = (
error: errorEquippableData,
refetch: refetchEquippableData,
} = useReadContract({
- address: EVM_RMRK_CONTRACTS[network].RMRKEquipRenderUtils,
+ address: config.utilityContracts[chainId]?.RMRKEquipRenderUtils,
abi: RMRKEquipRenderUtils,
chainId,
functionName: 'composeEquippables',
diff --git a/packages/rmrk-hooks/src/lib/hooks/use-get-interface-support.ts b/packages/rmrk-hooks/src/lib/hooks/use-get-interface-support.ts
index 4f93759..46eaa43 100644
--- a/packages/rmrk-hooks/src/lib/hooks/use-get-interface-support.ts
+++ b/packages/rmrk-hooks/src/lib/hooks/use-get-interface-support.ts
@@ -1,12 +1,8 @@
-import {
- EVM_NETWORKS,
- EVM_RMRK_CONTRACTS,
- RMRKCollectionUtils,
- mapChainIdToNetwork,
-} from '@rmrk-team/rmrk-evm-utils';
+import { RMRKCollectionUtils } from '@rmrk-team/rmrk-evm-utils';
import type { Chain } from 'viem';
import type { Address } from 'viem';
import { useReadContract } from 'wagmi';
+import { useRMRKConfig } from '../RMRKContextProvider.js';
type Arguments = {
contractAddress: Address;
@@ -25,10 +21,10 @@ const ONE_DAY = 24 * 60 * 60 * 1000;
export const useGetInterfaceSupport = (args: Arguments, options?: Options) => {
const { contractAddress, chainId } = args;
const { enabled = true } = options || {};
- const network = mapChainIdToNetwork(chainId);
+ const config = useRMRKConfig();
- const { data, isLoading, error, refetch } = useReadContract({
- address: EVM_RMRK_CONTRACTS[network].RMRKCollectionUtils,
+ const { data, ...reactQueryReturnProps } = useReadContract({
+ address: config.utilityContracts[chainId]?.RMRKCollectionUtils,
abi: RMRKCollectionUtils,
functionName: 'getInterfaceSupport',
chainId,
@@ -60,8 +56,6 @@ export const useGetInterfaceSupport = (args: Arguments, options?: Options) => {
return {
interfaceSupport,
- isLoading,
- error,
- refetch,
+ ...reactQueryReturnProps,
};
};
diff --git a/packages/rmrk-hooks/src/lib/hooks/use-get-token-primary-asset.ts b/packages/rmrk-hooks/src/lib/hooks/use-get-token-primary-asset.ts
index 557cf1a..4f592e7 100644
--- a/packages/rmrk-hooks/src/lib/hooks/use-get-token-primary-asset.ts
+++ b/packages/rmrk-hooks/src/lib/hooks/use-get-token-primary-asset.ts
@@ -1,12 +1,9 @@
-import {
- EVM_RMRK_CONTRACTS,
- RMRKEquipRenderUtils,
- mapChainIdToNetwork,
-} from '@rmrk-team/rmrk-evm-utils';
+import { RMRKEquipRenderUtils } from '@rmrk-team/rmrk-evm-utils';
import type { RMRKAssetExtended } from '@rmrk-team/types';
import type { Address, Chain } from 'viem';
import { useReadContract } from 'wagmi';
import { useGetInterfaceSupport } from './use-get-interface-support.js';
+import { useRMRKConfig } from '../RMRKContextProvider.js';
type Arguments = {
tokenId: bigint;
@@ -31,6 +28,7 @@ export const useGetTokenPrimaryAsset = (
refetch: () => void;
primaryAsset: RMRKAssetExtended | undefined;
} => {
+ const config = useRMRKConfig();
const {
contractAddress,
tokenId,
@@ -44,8 +42,6 @@ export const useGetTokenPrimaryAsset = (
supportsEquippableInterface === undefined ||
supportsMultiAssetInterface === undefined;
- const network = mapChainIdToNetwork(chainId);
-
const {
isLoading: isLoadingGetInterfaceSupport,
interfaceSupport: { supportsEquippable, supportsMultiAsset },
@@ -65,7 +61,7 @@ export const useGetTokenPrimaryAsset = (
refetch: refetTopAssetForToken,
} = useReadContract({
address: enabledSimplePrimaryAsset
- ? EVM_RMRK_CONTRACTS[network].RMRKEquipRenderUtils
+ ? config.utilityContracts[chainId]?.RMRKEquipRenderUtils
: undefined,
abi: RMRKEquipRenderUtils,
functionName: 'getTopAsset',
@@ -81,7 +77,7 @@ export const useGetTokenPrimaryAsset = (
refetch: refetchTopAssetAndEquippableDataForToken,
} = useReadContract({
address: enabledAssetWithEquippableData
- ? EVM_RMRK_CONTRACTS[network].RMRKEquipRenderUtils
+ ? config.utilityContracts[chainId]?.RMRKEquipRenderUtils
: undefined,
abi: RMRKEquipRenderUtils,
functionName: 'getTopAssetAndEquippableDataForToken',
diff --git a/packages/rmrk-hooks/tsconfig.build.json b/packages/rmrk-hooks/tsconfig.build.json
index f451771..6358ea3 100644
--- a/packages/rmrk-hooks/tsconfig.build.json
+++ b/packages/rmrk-hooks/tsconfig.build.json
@@ -2,6 +2,7 @@
"extends": "../../tsconfig.base.json",
"include": [
"src/**/*.ts",
+ "src/**/*.tsx",
"./node_modules/@tanstack/react-query/build/modern/types.d.ts"
],
"exclude": ["src/**/*.test.ts", "src/**/*.test-d.ts"],
@@ -11,7 +12,8 @@
"outDir": "./dist/esm",
"declarationDir": "./dist/types",
"rootDir": "src",
- "preserveSymlinks": false
+ "preserveSymlinks": false,
+ "jsx": "react-jsx"
},
"references": [
{
diff --git a/packages/rmrk-hooks/tsconfig.json b/packages/rmrk-hooks/tsconfig.json
index bacbc92..bb4c334 100644
--- a/packages/rmrk-hooks/tsconfig.json
+++ b/packages/rmrk-hooks/tsconfig.json
@@ -1,5 +1,8 @@
{
"extends": "./tsconfig.build.json",
- "include": ["src/**/*.ts", "test/**/*.ts"],
- "exclude": []
+ "include": ["src/**/*.ts", "test/**/*.ts", "src/**/*.tsx"],
+ "exclude": [],
+ "compilerOptions": {
+ "jsx": "react-jsx"
+ }
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 25cdd56..eb1b6b2 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -80,6 +80,9 @@ importers:
'@rmrk-team/rmrk-evm-utils':
specifier: workspace:*
version: link:../../packages/rmrk-evm-utils
+ '@rmrk-team/rmrk-hooks':
+ specifier: workspace:*
+ version: link:../../packages/rmrk-hooks
'@tanstack/react-query':
specifier: ^5.17.12
version: 5.17.12(react@18.2.0)
@@ -375,6 +378,9 @@ importers:
pixi.js:
specifier: ^7.2.4
version: 7.3.3
+ ramda:
+ specifier: ^0.29.1
+ version: 0.29.1
use-image:
specifier: ^1.1.1
version: 1.1.1(react-dom@18.2.0)(react@18.2.0)
@@ -391,6 +397,9 @@ importers:
'@types/node':
specifier: 18.16.9
version: 18.16.9
+ '@types/ramda':
+ specifier: ^0.29.10
+ version: 0.29.10
'@types/react':
specifier: 18.2.33
version: 18.2.33
@@ -5243,6 +5252,12 @@ packages:
/@types/prop-types@15.7.11:
resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==}
+ /@types/ramda@0.29.10:
+ resolution: {integrity: sha512-0BzWVKtSEtignlk+XBuK88Il5wzQwbRVfEkzE8iKm02NYHMGQ/9ffB05M+zXhTCqo50DOIAT9pNSJsjFMMG4rQ==}
+ dependencies:
+ types-ramda: 0.29.7
+ dev: true
+
/@types/react-dom@18.2.14:
resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==}
dependencies:
@@ -12036,6 +12051,10 @@ packages:
/radix3@1.1.0:
resolution: {integrity: sha512-pNsHDxbGORSvuSScqNJ+3Km6QAVqk8CfsCBIEoDgpqLrkD2f3QM4I7d1ozJJ172OmIcoUcerZaNWqtLkRXTV3A==}
+ /ramda@0.29.1:
+ resolution: {integrity: sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==}
+ dev: false
+
/range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
@@ -13293,6 +13312,10 @@ packages:
resolution: {integrity: sha512-Y+jOjihlFriWzcBjncPCf2/am+Hgz7LtsWs77pWg5vQQKLQj07oNrJryo/wK2G0ndNaoVn2ownFMeoeAuReu3Q==}
dev: true
+ /ts-toolbelt@9.6.0:
+ resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+ dev: true
+
/tsc-alias@1.8.8:
resolution: {integrity: sha512-OYUOd2wl0H858NvABWr/BoSKNERw3N9GTi3rHPK8Iv4O1UyUXIrTTOAZNHsjlVpXFOhpJBVARI1s+rzwLivN3Q==}
hasBin: true
@@ -13430,6 +13453,12 @@ packages:
is-typed-array: 1.1.12
dev: true
+ /types-ramda@0.29.7:
+ resolution: {integrity: sha512-8KBxZGJwUF3MpRkkJauSpvfHXk8Ssq15QXGuCBTDGeKd9PfheokkC3wAKRV3djej9O31Qa5M7Owsg8hF0GjtAw==}
+ dependencies:
+ ts-toolbelt: 9.6.0
+ dev: true
+
/typescript@5.3.3:
resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==}
engines: {node: '>=14.17'}