Skip to content

Commit 121c305

Browse files
authored
Add resend transaction execution (#153)
* contract * contract * contract * contract
1 parent 45eaf57 commit 121c305

16 files changed

Lines changed: 613 additions & 513 deletions

components/contract-execution/components/shared-components.tsx

Lines changed: 0 additions & 86 deletions
This file was deleted.

components/contract-execution/components/function-item.tsx renamed to components/contract-execution/contract-execution-tabs/function-item.tsx

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,29 @@
1-
import { zodResolver } from "@hookform/resolvers/zod";
21
import { memo, useCallback, useState } from "react";
3-
import { FormProvider, useForm } from "react-hook-form";
4-
import type { AbiFunction, Address } from "viem";
5-
import { isAddress } from "viem";
6-
import { z } from "zod";
2+
import { FormProvider } from "react-hook-form";
3+
import type { AbiFunction } from "viem";
74
import { AbiItemFormWithPreview } from "../../abi-form/abi-item-form-with-preview.js";
8-
import type { AddressData } from "../../address-autocomplete-input.js";
95
import {
106
AccordionContent,
117
AccordionItem,
128
AccordionTrigger,
139
} from "../../shadcn/accordion.js";
14-
import type { ExecutionParams } from "../types.js";
15-
import { useFunctionExecution } from "../use-function-execution.js";
16-
import { DefaultResultDisplay } from "./result-display.js";
1710
import {
1811
ActionButtons,
1912
ConnectWalletAlert,
13+
DefaultResultDisplay,
2014
MsgSenderInput,
21-
} from "./shared-components.js";
15+
} from "../shared/components.js";
16+
import { useMsgSenderForm } from "../shared/form-utils.js";
17+
import type { BaseExecutionProps, ExecutionParams } from "../shared/types.js";
18+
import { useFunctionExecution } from "../shared/use-function-execution.js";
19+
import { isWriteFunction } from "../shared/utils.js";
2220

23-
const executionFormSchema = z.object({
24-
msgSender: z
25-
.string()
26-
.refine(
27-
(val) => {
28-
if (!val) return true;
29-
return isAddress(val);
30-
},
31-
{ message: "Invalid address format" },
32-
)
33-
.optional(),
34-
});
35-
36-
interface FunctionItemProps {
21+
interface FunctionItemProps extends BaseExecutionProps {
3722
func: AbiFunction;
3823
index: number;
39-
address: Address;
40-
chainId: number;
41-
sender?: Address;
42-
addresses?: AddressData[];
43-
requiresConnection: boolean;
44-
isConnected: boolean;
4524
onQuery: (params: ExecutionParams) => Promise<`0x${string}`>;
4625
onWrite: (params: ExecutionParams) => Promise<`0x${string}`>;
4726
onSimulate?: (params: ExecutionParams) => Promise<`0x${string}`>;
48-
addressRenderer?: (address: Address) => React.ReactNode;
49-
onHashClick?: (hash: string) => void;
5027
}
5128

5229
export const FunctionItem = memo(
@@ -68,19 +45,9 @@ export const FunctionItem = memo(
6845
const [callData, setCallData] = useState<string>("");
6946
const { result, isSimulating, isExecuting, simulate, execute } =
7047
useFunctionExecution();
48+
const { form, msgSender } = useMsgSenderForm(sender);
7149

72-
const form = useForm({
73-
mode: "onChange",
74-
resolver: zodResolver(executionFormSchema),
75-
defaultValues: {
76-
msgSender: "",
77-
},
78-
});
79-
80-
const msgSender = form.watch().msgSender || "";
81-
82-
const isWrite =
83-
func.stateMutability !== "view" && func.stateMutability !== "pure";
50+
const isWrite = isWriteFunction(func);
8451

8552
const handleCallDataChange = useCallback(
8653
(newCallData: string | undefined) => {
@@ -93,7 +60,7 @@ export const FunctionItem = memo(
9360
simulate({
9461
abiFunction: func,
9562
callData,
96-
msgSender: msgSender ? (msgSender as Address) : undefined,
63+
msgSender,
9764
onQuery,
9865
onWrite,
9966
onSimulate,
@@ -104,7 +71,7 @@ export const FunctionItem = memo(
10471
execute({
10572
abiFunction: func,
10673
callData,
107-
msgSender: msgSender ? (msgSender as Address) : undefined,
74+
msgSender,
10875
onQuery,
10976
onWrite,
11077
onSimulate,
@@ -128,10 +95,6 @@ export const FunctionItem = memo(
12895
<div className="mt-4 space-y-6">
12996
{isWrite && <MsgSenderInput />}
13097

131-
{isWrite && requiresConnection && !isConnected && (
132-
<ConnectWalletAlert />
133-
)}
134-
13598
<AbiItemFormWithPreview
13699
addresses={addresses}
137100
key={func.name}
@@ -153,6 +116,10 @@ export const FunctionItem = memo(
153116
}
154117
/>
155118

119+
{isWrite && requiresConnection && !isConnected && (
120+
<ConnectWalletAlert />
121+
)}
122+
156123
<ActionButtons
157124
isWrite={isWrite}
158125
callData={callData}

components/contract-execution/components/contract-functions-list.tsx renamed to components/contract-execution/contract-execution-tabs/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import { cn } from "../../../lib/utils.js";
55
import { Accordion } from "../../shadcn/accordion.js";
66
import { Input } from "../../shadcn/input.js";
77
import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../shadcn/tabs.js";
8-
import type { ContractFunctionsListProps } from "../types.js";
8+
import type { ContractFunctionsListProps } from "../shared/types.js";
99
import { FunctionItem } from "./function-item.js";
10-
import { RawOperations } from "./raw-operations.js";
11-
import { SignatureOperations } from "./signature-operations.js";
10+
import { RawOperations } from "./raw-tab.js";
11+
import { SignatureOperations } from "./signature-tab.js";
1212

1313
export function ContractFunctionsList({
1414
abi,

0 commit comments

Comments
 (0)