useQueryRaw
Query hook for dispatching a "raw" query to a CosmWasm smart contract's storage.
This hook uses the first active chain's CosmWasm client. For multi-chain raw queries, use useCosmWasmClient directly.
Usage
Basic Raw Query
import { useQueryRaw } from "graz";
function QueryRawStorage() {
  const { data, isLoading, error } = useQueryRaw({
    address: "juno1contractaddress...",
    key: "config",
  });
  if (isLoading) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;
  // data is Uint8Array, decode as needed
  const decoded = data ? new TextDecoder().decode(data) : null;
  return <div>Raw Data: {decoded}</div>;
}
Decoding Binary Data
import { useQueryRaw } from "graz";
import { fromUtf8 } from "@cosmjs/encoding";
function QueryWithDecoding() {
  const { data } = useQueryRaw({
    address: "juno1contract...",
    key: "state",
  });
  const decodedString = data ? fromUtf8(data) : null;
  const parsedData = decodedString ? JSON.parse(decodedString) : null;
  return <div>{parsedData && <pre>{JSON.stringify(parsedData, null, 2)}</pre>}</div>;
}
Conditional Query
import { useQueryRaw } from "graz";
function ConditionalRawQuery({ contractAddress, storageKey }: {
  contractAddress?: string;
  storageKey?: string;
}) {
  const { data, isLoading } = useQueryRaw({
    address: contractAddress, // Query only runs when both are defined
    key: storageKey,
  });
  return <div>{data && `Data length: ${data.length} bytes`}</div>;
}
Multi-Chain Raw Queries
For raw queries on multiple chains, use useCosmWasmClient directly:
import { useCosmWasmClient } from "graz";
import { useQuery } from "@tanstack/react-query";
import { toUtf8 } from "@cosmjs/encoding";
function MultiChainRawQuery() {
  const { data: clients } = useCosmWasmClient({
    chainId: ["juno-1", "stargaze-1"],
  });
  const { data: results } = useQuery({
    queryKey: ["multi-chain-raw-query", clients],
    queryFn: async () => {
      const junoClient = clients?.["juno-1"];
      const stargazeClient = clients?.["stargaze-1"];
      if (!junoClient || !stargazeClient) return null;
      const [junoRaw, stargazeRaw] = await Promise.all([
        junoClient.queryContractRaw("juno1contract...", toUtf8("config")),
        stargazeClient.queryContractRaw("stars1contract...", toUtf8("config")),
      ]);
      return {
        "juno-1": junoRaw,
        "stargaze-1": stargazeRaw,
      };
    },
    enabled: Boolean(clients?.["juno-1"] && clients?.["stargaze-1"]),
  });
  return (
    <div>
      {results && Object.entries(results).map(([chainId, data]) => (
        <div key={chainId}>
          {chainId}: {data ? `${data.length} bytes` : "No data"}
        </div>
      ))}
    </div>
  );
}
Hook Params
{
  address?: string; // The address of the contract to query
  key?: string; // The key to lookup in the contract storage
}
Note: Query only executes when both address and key are defined.
Return Value
{
  data?: Uint8Array | null; // Raw binary data from contract storage
  dataUpdatedAt: number;
  error: TError | null;
  errorUpdatedAt: number;
  failureCount: number;
  errorUpdateCount: number;
  isError: boolean;
  isFetched: boolean;
  isFetchedAfterMount: boolean;
  isFetching: boolean;
  isLoading: boolean;
  isLoadingError: boolean;
  isPaused: boolean;
  isPlaceholderData: boolean;
  isRefetchError: boolean;
  isRefetching: boolean;
  isStale: boolean;
  isSuccess: boolean;
  refetch: (options?: RefetchOptions & RefetchQueryFilters) => Promise<QueryObserverResult<Uint8Array | null, unknown>>;
  remove: () => void;
  status: 'loading' | 'error' | 'success';
  fetchStatus: 'fetching' | 'paused' | 'idle';
}
Working with Raw Data
Raw queries return Uint8Array data. Here are common ways to work with it:
Decode as UTF-8 String
import { fromUtf8 } from "@cosmjs/encoding";
const decodedString = data ? fromUtf8(data) : null;
Decode as JSON
import { fromUtf8 } from "@cosmjs/encoding";
const jsonData = data ? JSON.parse(fromUtf8(data)) : null;
Use Native TextDecoder
const decoded = data ? new TextDecoder().decode(data) : null;
Difference from useQuerySmart
- useQueryRaw: Queries raw contract storage by key, returns- Uint8Array
- useQuerySmart: Executes a smart contract query message, returns decoded JSON
Use useQueryRaw for direct storage access and useQuerySmart for standard contract queries.