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'}