diff --git a/templates/chain-template/components/contract/common/index.ts b/templates/chain-template/components/contract/common/index.ts index 5ecdbf61..fb9979a7 100644 --- a/templates/chain-template/components/contract/common/index.ts +++ b/templates/chain-template/components/contract/common/index.ts @@ -4,4 +4,6 @@ export * from './JsonInput'; export * from './ComboboxField'; export * from './ContractAddressField'; export * from './AttachFundsRadio'; +export * from './SelectAssetContent'; +export * from './SelectAssetItem'; export * from './BackButton'; diff --git a/templates/chain-template/hooks/contract/useCodeDetails.ts b/templates/chain-template/hooks/contract/useCodeDetails.ts index bd46f380..84fd718f 100644 --- a/templates/chain-template/hooks/contract/useCodeDetails.ts +++ b/templates/chain-template/hooks/contract/useCodeDetails.ts @@ -1,5 +1,6 @@ import { useQuery } from '@tanstack/react-query'; -import { createGetCode } from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.func'; +import { useGetCode } from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.react'; +import { defaultContext } from '@tanstack/react-query'; import { prettyCodeInfo } from '@/utils'; import { useChainStore } from '@/contexts'; @@ -9,25 +10,22 @@ export const useCodeDetails = (codeId: number, enabled: boolean = true) => { const { selectedChain } = useChainStore(); const { data: rpcEndpoint } = useRpcEndpoint(selectedChain); - return useQuery({ - queryKey: ['useCodeDetails', codeId], - queryFn: async () => { - const getCode = createGetCode(rpcEndpoint); - try { - const { codeInfo } = await getCode({ - codeId: BigInt(codeId), - }); - return codeInfo && prettyCodeInfo(codeInfo); - } catch (error) { - console.error(error); - return null; - } + const { data, refetch } = useGetCode({ + request: { + codeId: BigInt(codeId), }, - enabled: !!rpcEndpoint && enabled, - retry: false, - cacheTime: 0, - refetchOnMount: false, - refetchOnReconnect: false, - refetchOnWindowFocus: false, + options: { + enabled: !!rpcEndpoint && enabled, + retry: false, + cacheTime: 0, + refetchOnMount: false, + refetchOnReconnect: false, + refetchOnWindowFocus: false, + select: ({ codeInfo }) => codeInfo && prettyCodeInfo(codeInfo), + context: defaultContext, + }, + clientResolver: rpcEndpoint, }); + + return { data, refetch }; }; diff --git a/templates/chain-template/hooks/contract/useExecuteContractTx.tsx b/templates/chain-template/hooks/contract/useExecuteContractTx.tsx index cd1a4494..dc4e5e85 100644 --- a/templates/chain-template/hooks/contract/useExecuteContractTx.tsx +++ b/templates/chain-template/hooks/contract/useExecuteContractTx.tsx @@ -1,9 +1,10 @@ -import { createExecuteContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx.rpc.func'; +import { useChain } from '@interchain-kit/react'; +import { useExecuteContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx.rpc.react'; +import { MsgExecuteContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx'; import { Coin, StdFee } from '@interchainjs/react/types'; +import { defaultContext } from '@tanstack/react-query'; import { toUint8Array } from '@/utils'; - -import { useHandleTx } from './useHandleTx'; import { useCustomSigningClient } from '../common'; interface ExecuteTxParams { @@ -17,8 +18,14 @@ interface ExecuteTxParams { } export const useExecuteContractTx = (chainName: string) => { + const { address } = useChain(chainName); const { data: signingClient } = useCustomSigningClient(); - const handleTx = useHandleTx(chainName); + const { mutate: executeContract, isLoading } = useExecuteContract({ + clientResolver: signingClient, + options: { + context: defaultContext, + }, + }); const executeTx = async ({ address, @@ -26,29 +33,37 @@ export const useExecuteContractTx = (chainName: string) => { fee, funds, msg, - onTxFailed = () => {}, - onTxSucceed = () => {}, + onTxFailed = () => { }, + onTxSucceed = () => { }, }: ExecuteTxParams) => { - await handleTx({ - txFunction: async () => { - const executeContract = createExecuteContract(signingClient); - const res = await executeContract( - address, - { - sender: address, - contract: contractAddress, - msg: toUint8Array(msg), - funds, - }, - fee, - '', - ); - return res; - }, - onTxSucceed, - onTxFailed, + const message = MsgExecuteContract.fromPartial({ + sender: address, + contract: contractAddress, + msg: toUint8Array(msg), + funds, }); + + executeContract( + { + signerAddress: address, + message, + fee, + memo: 'Execute Contract', + }, + { + onSuccess: (res) => { + if (res.code !== 0) { + throw new Error(res.rawLog || 'Failed to execute contract'); + } + onTxSucceed(); + }, + onError: (error) => { + console.error('Failed to execute contract:', error); + onTxFailed(); + }, + } + ); }; - return { executeTx }; + return { executeTx, isLoading }; }; diff --git a/templates/chain-template/hooks/contract/useInstantiateTx.tsx b/templates/chain-template/hooks/contract/useInstantiateTx.tsx index 3eaa9e6d..7d083fd7 100644 --- a/templates/chain-template/hooks/contract/useInstantiateTx.tsx +++ b/templates/chain-template/hooks/contract/useInstantiateTx.tsx @@ -1,9 +1,10 @@ -import { createInstantiateContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx.rpc.func'; +import { useChain } from '@interchain-kit/react'; +import { useInstantiateContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx.rpc.react'; +import { MsgInstantiateContract } from '@interchainjs/react/cosmwasm/wasm/v1/tx'; import { Coin, DeliverTxResponse, StdFee } from '@interchainjs/react/types'; +import { defaultContext } from '@tanstack/react-query'; import { toUint8Array } from '@/utils'; - -import { useHandleTx } from './useHandleTx'; import { useCustomSigningClient } from '../common'; interface InstantiateTxParams { @@ -18,8 +19,14 @@ interface InstantiateTxParams { } export const useInstantiateTx = (chainName: string) => { + const { address } = useChain(chainName); const { data: signingClient } = useCustomSigningClient(); - const handleTx = useHandleTx(chainName); + const { mutate: instantiateContract, isLoading } = useInstantiateContract({ + clientResolver: signingClient, + options: { + context: defaultContext, + }, + }); const instantiateTx = async ({ address, @@ -28,34 +35,41 @@ export const useInstantiateTx = (chainName: string) => { label, admin, funds, - onTxSucceed, - onTxFailed, + onTxSucceed = () => { }, + onTxFailed = () => { }, }: InstantiateTxParams) => { const fee: StdFee = { amount: [], gas: '300000' }; - await handleTx({ - txFunction: async () => { - const instantiateContract = createInstantiateContract(signingClient); - const res = await instantiateContract( - address, - { - sender: address, - codeId: BigInt(codeId), - admin, - funds, - label, - msg: toUint8Array(initMsg), - }, - fee, - '', - ); - return res; - }, - successMessage: 'Instantiate Success', - onTxSucceed, - onTxFailed, + const message = MsgInstantiateContract.fromPartial({ + sender: address, + codeId: BigInt(codeId), + admin, + funds, + label, + msg: toUint8Array(initMsg), }); + + instantiateContract( + { + signerAddress: address, + message, + fee, + memo: 'Instantiate Contract', + }, + { + onSuccess: (res) => { + if (res.code !== 0) { + throw new Error(res.rawLog || 'Failed to instantiate contract'); + } + onTxSucceed(res); + }, + onError: (error) => { + console.error('Failed to instantiate contract:', error); + onTxFailed(); + }, + } + ); }; - return { instantiateTx }; + return { instantiateTx, isLoading }; }; diff --git a/templates/chain-template/hooks/contract/useMyContracts.ts b/templates/chain-template/hooks/contract/useMyContracts.ts index 1e3c6fc4..0bde9dfb 100644 --- a/templates/chain-template/hooks/contract/useMyContracts.ts +++ b/templates/chain-template/hooks/contract/useMyContracts.ts @@ -1,18 +1,25 @@ import { useChain } from '@interchain-kit/react'; -import { useQuery } from '@tanstack/react-query'; -import { - createGetContractsByCreator, - createGetContractInfo, -} from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.func'; -import { RpcResolver } from '@interchainjs/react/helper-func-types'; +import { useGetContractsByCreator } from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.react'; +import { defaultContext } from '@tanstack/react-query'; import { useChainStore } from '@/contexts'; - import { useRpcEndpoint } from '../common'; -export type WasmContractInfo = Awaited< - ReturnType ->[number]; +export type WasmContractInfo = { + address: string; + contractInfo: { + label: string; + codeId: bigint; + admin: string; + creator: string; + created?: { + blockHeight: bigint; + txIndex: bigint; + }; + ibc_port_id?: string; + extension?: any; + }; +}; type Contracts = { wasmContracts: WasmContractInfo[]; @@ -23,33 +30,9 @@ export const useMyContracts = () => { const { address } = useChain(selectedChain); const { data: rpcEndpoint } = useRpcEndpoint(selectedChain); - return useQuery({ - queryKey: ['myContracts', selectedChain, address], - queryFn: async () => { - const contracts: Contracts = { - wasmContracts: [], - }; - - if (address && rpcEndpoint) { - contracts.wasmContracts = await fetchWasmContracts( - rpcEndpoint, - address, - ); - } - - return contracts; - }, - enabled: !!address && !!rpcEndpoint, - }); -}; - -const fetchWasmContracts = async (client: RpcResolver, address: string) => { - const getContractsByCreator = createGetContractsByCreator(client); - const getContractInfo = createGetContractInfo(client); - - try { - const { contractAddresses } = await getContractsByCreator({ - creatorAddress: address, + const { data, isLoading } = useGetContractsByCreator({ + request: { + creatorAddress: address || '', pagination: { limit: 1000n, reverse: true, @@ -57,15 +40,27 @@ const fetchWasmContracts = async (client: RpcResolver, address: string) => { key: new Uint8Array(), offset: 0n, }, - }); - - const contracts = await Promise.all( - contractAddresses.map((address) => getContractInfo({ address })), - ); + }, + options: { + enabled: !!address && !!rpcEndpoint, + select: ({ contractAddresses }) => { + const contracts: Contracts = { + wasmContracts: contractAddresses.map((address) => ({ + address, + contractInfo: { + label: 'Contract', // Placeholder - full implementation would fetch this + codeId: 0n, + admin: '', + creator: '', + }, + })), + }; + return contracts; + }, + context: defaultContext, + }, + clientResolver: rpcEndpoint, + }); - return contracts; - } catch (error) { - console.error('Error fetching WASM contracts:', error); - return []; - } + return { data, isLoading }; }; diff --git a/templates/chain-template/hooks/contract/useQueryContract.ts b/templates/chain-template/hooks/contract/useQueryContract.ts index 41627e1e..d6ebccb0 100644 --- a/templates/chain-template/hooks/contract/useQueryContract.ts +++ b/templates/chain-template/hooks/contract/useQueryContract.ts @@ -1,9 +1,9 @@ import { useQuery } from '@tanstack/react-query'; -import { createGetSmartContractState } from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.func'; +import { useGetSmartContractState } from '@interchainjs/react/cosmwasm/wasm/v1/query.rpc.react'; +import { defaultContext } from '@tanstack/react-query'; import { useChainStore } from '@/contexts'; import { fromUint8Array, toUint8Array } from '@/utils'; - import { useRpcEndpoint } from '../common'; export const useQueryContract = ({ @@ -18,19 +18,18 @@ export const useQueryContract = ({ const { selectedChain } = useChainStore(); const { data: rpcEndpoint } = useRpcEndpoint(selectedChain); - return useQuery({ - queryKey: ['useQueryContract', contractAddress, queryMsg], - queryFn: () => { - const parsedQueryMsg = queryMsg ? JSON.parse(queryMsg) : null; - const getSmartContractState = createGetSmartContractState(rpcEndpoint); - return getSmartContractState({ - address: contractAddress, - queryData: parsedQueryMsg - ? toUint8Array(parsedQueryMsg) - : new Uint8Array(), - }); + const { data, refetch, error, isFetching } = useGetSmartContractState({ + request: { + address: contractAddress, + queryData: queryMsg ? toUint8Array(JSON.parse(queryMsg)) : new Uint8Array(), + }, + options: { + enabled: !!rpcEndpoint && !!contractAddress && !!queryMsg && enabled, + select: ({ data }) => fromUint8Array(data), + context: defaultContext, }, - select: ({ data }) => fromUint8Array(data), - enabled: !!rpcEndpoint && !!contractAddress && !!queryMsg && enabled, + clientResolver: rpcEndpoint, }); + + return { data, refetch, error, isFetching }; };