From a7f45f6c28bfc9775ee44dfcf649ba27d26785b9 Mon Sep 17 00:00:00 2001 From: Calvin Chang Date: Fri, 22 Dec 2023 10:56:24 +0800 Subject: [PATCH] feat: add BatchTxEditor --- src/components/EvmEditor.tsx | 8 ++ .../EvmEditors/EvmBatchTxEditor.tsx | 95 +++++++++++++++++++ src/components/EvmEditors/EvmTxForm.tsx | 7 +- 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/components/EvmEditors/EvmBatchTxEditor.tsx diff --git a/src/components/EvmEditor.tsx b/src/components/EvmEditor.tsx index d7c0f71..bbe9c51 100644 --- a/src/components/EvmEditor.tsx +++ b/src/components/EvmEditor.tsx @@ -28,6 +28,7 @@ import EvmSignEditor from "./EvmEditors/EvmSignEditor"; import EvmUserOpEditor from "./EvmEditors/EvmUserOpEditor"; import EvmSendEditor from "./EvmEditors/EvmSendEditor"; import EvmContractEditor from "./EvmEditors/EvmContractEditor"; +import EvmBatchTxEditor from "./EvmEditors/EvmBatchTxEditor"; import type { EthereumTypes } from "@blocto/sdk"; import { bloctoSDK, useEthereum, supportedChains, web3 } from "../services/evm"; import ReactJson from "react-json-view"; @@ -233,6 +234,7 @@ const EvmEditor = (): ReactJSXElement => { User Operation Send Contract + Batch Transaction @@ -266,6 +268,12 @@ const EvmEditor = (): ReactJSXElement => { chainId={chainId} /> + + + diff --git a/src/components/EvmEditors/EvmBatchTxEditor.tsx b/src/components/EvmEditors/EvmBatchTxEditor.tsx new file mode 100644 index 0000000..3fa6c48 --- /dev/null +++ b/src/components/EvmEditors/EvmBatchTxEditor.tsx @@ -0,0 +1,95 @@ +import React, { useEffect, useState, Dispatch, SetStateAction } from "react"; +import { + Box, + Text, + Grid, + Flex, + IconButton, + Radio, + RadioGroup, +} from "@chakra-ui/react"; +import { AddIcon, CloseIcon } from "@chakra-ui/icons"; +import { ReactJSXElement } from "@emotion/react/types/jsx-namespace"; +import type { EthereumTypes } from "@blocto/sdk"; +import EvmTxForm from "./EvmTxForm"; + +interface EvmBatchTxEditorProps { + setRequestObject: Dispatch< + SetStateAction + >; + account: string | null; +} + +const EvmBatchTxEditor = ({ + setRequestObject, + account, +}: EvmBatchTxEditorProps): ReactJSXElement => { + const [revert, setRevert] = useState("true"); + const [txs, setTxs] = useState([{}]); + useEffect(() => { + if (account) { + setRequestObject({ + method: "wallet_sendMultiCallTransaction", + params: [txs, revert === "true"], + }); + } + }, [account, setRequestObject, revert, txs]); + + return ( + <> + + Revert + { + setRevert(e); + }} + > + + true + false + + + + + Transaction + } + size="xs" + colorScheme="blue" + onClick={() => { + setTxs((prev) => [...prev, ""]); + }} + /> + + + {txs.map((value, i) => ( + + + Transaction {i + 1} + + + { + setTxs((prev) => { + const newTxs = [...prev]; + newTxs[i] = tx; + return newTxs; + }); + }} + account={account} + /> + + + ))} + + + + ); +}; + +export default EvmBatchTxEditor; diff --git a/src/components/EvmEditors/EvmTxForm.tsx b/src/components/EvmEditors/EvmTxForm.tsx index 6eab8ca..9260169 100644 --- a/src/components/EvmEditors/EvmTxForm.tsx +++ b/src/components/EvmEditors/EvmTxForm.tsx @@ -48,7 +48,12 @@ const EvmTxForm = ({ }, [account]); return ( - + From: