cyb/src/hooks/contract/useExecuteContract.ts

import { Coin } from '@cosmjs/launchpad';
import { useMutation } from '@tanstack/react-query';
import { useSigningClient } from 'src/contexts/signerClient';
import Soft3MessageFactory from 'src/services/soft.js/api/msgs';

type Props = {
  contractAddress: string;
  query: any;
  funds?: Coin[] | undefined;
};

function useExecuteContract({ contractAddress, query, funds }: Props) {
  const { signer, signingClient } = useSigningClient();

  const { mutate, data, isLoading, error } = useMutation({
    // mutationKey: 'useExecuteContract',
    mutationFn: async () => {
      if (!signer || !signingClient) {
        return Promise.reject('No signer or signing client');
      }

      const [{ address }] = await signer.getAccounts();

      return signingClient.execute(
        address,
        contractAddress,
        query,
        Soft3MessageFactory.fee(2),
        '',
        funds
      );
    },
  });

  let formattedError = error?.message;
  if (formattedError === 'Request rejected') {
    formattedError = '';
  }

  return {
    isLoading,
    isReady: Boolean(signer && signingClient),
    transactionHash: data?.transactionHash as string | undefined,
    error: formattedError,
    mutate,
  };
}

export default useExecuteContract;

Neighbours