Эх сурвалжийг харах

[react]: add useSimulateTransaction hook (#174)

* feat: add useSimulateTransaction hook

* chore: changeset

* fix: added config in queryKey & default config making config optional

* fix: removed apostrophe from changeset

* fix: fixing merge conflict in index.ts imports

* fix: updates required by recent package changes

---------

Co-authored-by: nickfrosty <75431177+nickfrosty@users.noreply.github.com>
Pratik 1 сар өмнө
parent
commit
d59e1fdc05

+ 5 - 0
.changeset/thirty-bugs-bake.md

@@ -0,0 +1,5 @@
+---
+"gill-react": minor
+---
+
+adds useSimulateTransaction hook

+ 33 - 0
packages/react/src/__typeset__/simulate-transaction.ts

@@ -0,0 +1,33 @@
+import { Base64EncodedWireTransaction, SimulateTransactionApi } from "gill";
+import { useSimulateTransaction } from "../hooks/simulate-transaction.js";
+
+// [DESCRIBE] useSimulateTransaction
+{
+  {
+    const { simulation } = useSimulateTransaction({
+      transaction: "123" as Base64EncodedWireTransaction,
+      config: { commitment: "confirmed", encoding: "base64" },
+    });
+    simulation satisfies ReturnType<SimulateTransactionApi["simulateTransaction"]>;
+  }
+
+  {
+    const { simulation } = useSimulateTransaction({
+      transaction: "123" as Base64EncodedWireTransaction,
+      config: { commitment: "confirmed", encoding: "base64" },
+      options: {
+        refetchInterval: 1000,
+      },
+    });
+    simulation satisfies ReturnType<SimulateTransactionApi["simulateTransaction"]>;
+  }
+
+  {
+    const { simulation } = useSimulateTransaction({
+      transaction: "123" as Base64EncodedWireTransaction,
+      config: { commitment: "confirmed", encoding: "base64" },
+      abortSignal: new AbortController().signal,
+    });
+    simulation satisfies ReturnType<SimulateTransactionApi["simulateTransaction"]>;
+  }
+}

+ 1 - 0
packages/react/src/hooks/index.ts

@@ -6,6 +6,7 @@ export * from "./program-accounts.js";
 export * from "./recent-prioritization-fees.js";
 export * from "./signature-statuses.js";
 export * from "./signatures-for-address.js";
+export * from "./simulate-transaction.js";
 export * from "./slot.js";
 export * from "./token-account.js";
 export * from "./token-mint.js";

+ 55 - 0
packages/react/src/hooks/simulate-transaction.ts

@@ -0,0 +1,55 @@
+"use client";
+import { useQuery } from "@tanstack/react-query";
+import type { Base64EncodedWireTransaction, Simplify, SimulateTransactionApi } from "gill";
+import { GILL_HOOK_CLIENT_KEY } from "../const.js";
+import { useSolanaClient } from "./client.js";
+import type { GillUseRpcHook } from "./types.js";
+
+type RpcConfig = Simplify<Parameters<SimulateTransactionApi["simulateTransaction"]>>[1];
+
+const DEFAULT_CONFIG: RpcConfig = {
+  replaceRecentBlockhash: true,
+  sigVerify: false,
+  encoding: "base64",
+  commitment: "confirmed",
+} as const;
+
+type UseSimulateTransactionInput<TConfig extends RpcConfig = RpcConfig> = Omit<GillUseRpcHook<TConfig>, "config"> & {
+  transaction: Base64EncodedWireTransaction;
+  /**
+   * @default { replaceRecentBlockhash: true, sigVerify: false, encoding: "base64", commitment: "confirmed" }
+   */
+  config?: TConfig;
+};
+
+type UseSimulateTransactionResponse = ReturnType<SimulateTransactionApi["simulateTransaction"]>;
+
+/**
+ * Simulate a transaction using the Solana RPC method of
+ * [`simulateTransaction`](https://solana.com/docs/rpc/http/simulatetransaction)
+ */
+export function useSimulateTransaction<TConfig extends RpcConfig = RpcConfig>({
+  options,
+  config,
+  abortSignal,
+  transaction,
+}: UseSimulateTransactionInput<TConfig>) {
+  const { rpc } = useSolanaClient();
+
+  const mergedConfig = { ...DEFAULT_CONFIG, ...config } as RpcConfig;
+
+  const { data, ...rest } = useQuery({
+    ...options,
+    enabled: !!transaction,
+    queryKey: [GILL_HOOK_CLIENT_KEY, "simulateTransaction", transaction, mergedConfig],
+    queryFn: async () => {
+      const simulation = await rpc.simulateTransaction(transaction, mergedConfig).send({ abortSignal });
+      return simulation;
+    },
+  });
+
+  return {
+    ...rest,
+    simulation: data as UseSimulateTransactionResponse,
+  };
+}