From 52d159c479a4f45a57ac1f1891fe043928eede92 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 5 Dec 2023 14:16:58 +0900 Subject: [PATCH 01/16] feat(components): support opinit transaction --- src/lib/components/TxFilterSelection.tsx | 14 ++++++++++++-- .../transactions/TransactionsTableMobileCard.tsx | 5 +++++ .../table/transactions/TransactionsTableRow.tsx | 10 ++++++++++ src/lib/data/constant.ts | 5 +++++ src/lib/gql/graphql.ts | 5 +++++ src/lib/services/expression/txExpression.ts | 1 + src/lib/services/txService.ts | 1 + src/lib/types/tx/transaction.ts | 6 ++++++ src/lib/utils/extractActionValue.ts | 2 ++ 9 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/lib/components/TxFilterSelection.tsx b/src/lib/components/TxFilterSelection.tsx index f9a6d010e..c98fad4ba 100644 --- a/src/lib/components/TxFilterSelection.tsx +++ b/src/lib/components/TxFilterSelection.tsx @@ -16,12 +16,17 @@ import { matchSorter } from "match-sorter"; import type { CSSProperties } from "react"; import { useMemo, useState, useRef, forwardRef } from "react"; -import { useMoveConfig, useWasmConfig } from "lib/app-provider"; +import { + useCurrentChain, + useMoveConfig, + useWasmConfig, +} from "lib/app-provider"; import { CustomIcon } from "lib/components/icon"; import { DEFAULT_BASE_TX_FILTERS, DEFAULT_MOVE_TX_FILTERS, DEFAULT_WASM_TX_FILTERS, + INITIA_TX_FILTERS, } from "lib/data"; import { displayActionValue, mergeRefs } from "lib/utils"; @@ -50,6 +55,7 @@ const listItemProps: CSSProperties = { const BASE_OPTIONS = Object.keys(DEFAULT_BASE_TX_FILTERS); const WASM_OPTIONS = Object.keys(DEFAULT_WASM_TX_FILTERS); const MOVE_OPTIONS = Object.keys(DEFAULT_MOVE_TX_FILTERS); +const INITIA_OPTIONS = Object.keys(INITIA_TX_FILTERS); // TODO - Refactor this along with TagSelection export const TxFilterSelection = forwardRef< @@ -80,13 +86,17 @@ export const TxFilterSelection = forwardRef< const wasm = useWasmConfig({ shouldRedirect: false }); const move = useMoveConfig({ shouldRedirect: false }); + const { chain } = useCurrentChain(); + const isInitia = chain.bech32_prefix === "init"; + const options = useMemo( () => [ ...BASE_OPTIONS, ...(wasm.enabled ? WASM_OPTIONS : []), ...(move.enabled ? MOVE_OPTIONS : []), + ...(isInitia ? INITIA_OPTIONS : []), ], - [wasm.enabled, move.enabled] + [wasm.enabled, move.enabled, isInitia] ); const partialResults = useMemo( diff --git a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx index 16967e43e..9e40527d6 100644 --- a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx +++ b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx @@ -55,6 +55,11 @@ export const TransactionsTableMobileCard = ({ IBC )} + {transaction.isOpinit && ( + + OPInit + + )} } bottomContent={ diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index e4bbba2e9..ad4152e6d 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -86,6 +86,16 @@ export const TransactionsTableRow = ({ IBC )} + {transaction.isOpinit && ( + + OPInit + + )} diff --git a/src/lib/data/constant.ts b/src/lib/data/constant.ts index 5018e9718..3b92ce6e5 100644 --- a/src/lib/data/constant.ts +++ b/src/lib/data/constant.ts @@ -1,5 +1,6 @@ import type { BaseTxFilters, + InitiaTxFilters, LVPair, MoveTxFilters, TxFilters, @@ -59,6 +60,10 @@ export const DEFAULT_MOVE_TX_FILTERS: MoveTxFilters = { isMoveScript: false, }; +export const INITIA_TX_FILTERS: InitiaTxFilters = { + isOpinit: false, +}; + export const DEFAULT_TX_FILTERS: TxFilters = { ...DEFAULT_BASE_TX_FILTERS, ...DEFAULT_WASM_TX_FILTERS, diff --git a/src/lib/gql/graphql.ts b/src/lib/gql/graphql.ts index f82b77014..6b60668b3 100644 --- a/src/lib/gql/graphql.ts +++ b/src/lib/gql/graphql.ts @@ -15625,6 +15625,7 @@ export type GetTxsByAddressPaginationQuery = { messages: any; is_send: boolean; is_ibc: boolean; + is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -21538,6 +21539,10 @@ export const GetTxsByAddressPaginationDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, + { + kind: "Field", + name: { kind: "Name", value: "is_opinit" }, + }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, diff --git a/src/lib/services/expression/txExpression.ts b/src/lib/services/expression/txExpression.ts index 903d9e15d..42b376af2 100644 --- a/src/lib/services/expression/txExpression.ts +++ b/src/lib/services/expression/txExpression.ts @@ -7,6 +7,7 @@ import { isTxHash } from "lib/utils"; const actions = { isSend: "is_send", isIbc: "is_ibc", + isOpinit: "is_opinit", isExecute: "is_execute", isInstantiate: "is_instantiate", isUpload: "is_store_code", diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index bba6afa3b..d1d933de9 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -148,6 +148,7 @@ export const useTxsByAddressPagination = ( transaction.is_signer ), isIbc: transaction.transaction.is_ibc, + isOpinit: transaction.transaction.is_opinit, isInstantiate: transaction.transaction.is_instantiate ?? false, })) ); diff --git a/src/lib/types/tx/transaction.ts b/src/lib/types/tx/transaction.ts index d7e6e0f90..bd92a661e 100644 --- a/src/lib/types/tx/transaction.ts +++ b/src/lib/types/tx/transaction.ts @@ -37,6 +37,12 @@ export interface Transaction { furtherAction: MsgFurtherAction; isIbc: boolean; isInstantiate: boolean; + isOpinit?: boolean; +} + +/* Filter for INITIA */ +export interface InitiaTxFilters { + isOpinit: boolean; } export interface BaseTxFilters { diff --git a/src/lib/utils/extractActionValue.ts b/src/lib/utils/extractActionValue.ts index f38a1222d..65e2b6468 100644 --- a/src/lib/utils/extractActionValue.ts +++ b/src/lib/utils/extractActionValue.ts @@ -4,6 +4,8 @@ export const displayActionValue = (isActionName: string) => { return "Send"; case "isIbc": return "IBC"; + case "isOpinit": + return "OPInit"; case "isUpload": return "Upload"; case "isInstantiate": From 5a15c234dfd24dd513436c6a8887dd287fd8fb59 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 5 Dec 2023 14:41:46 +0900 Subject: [PATCH 02/16] fix: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0d7c7865..78e2a13be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -58,6 +58,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features +- [#647](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia - [#642](https://github.com/alleslabs/celatone-frontend/pull/642) Add stone-12 network - [#629](https://github.com/alleslabs/celatone-frontend/pull/629) Add Amplitude for save account,to save code page count, and to save contract count - [#628](https://github.com/alleslabs/celatone-frontend/pull/628) Add Amplitude for contract states, pagination and contract details From cf1e74e8b08dd0ad6f52f42163d7ebd9f46532eb Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 5 Dec 2023 17:23:35 +0900 Subject: [PATCH 03/16] feat(components): add opinit badge in tx detail page --- src/lib/gql/graphql.ts | 14 ++++++++++++++ .../components/tx-message/TxMsgExpand.tsx | 15 +++++++++++++++ src/lib/services/txService.ts | 3 +++ 3 files changed, 32 insertions(+) diff --git a/src/lib/gql/graphql.ts b/src/lib/gql/graphql.ts index 6b60668b3..80a02d56e 100644 --- a/src/lib/gql/graphql.ts +++ b/src/lib/gql/graphql.ts @@ -15673,6 +15673,7 @@ export type GetTxsByPoolIdPaginationQuery = { success: boolean; messages: any; is_ibc: boolean; + is_opinit: boolean; account: { __typename?: "accounts"; address: string }; }; }>; @@ -15709,6 +15710,7 @@ export type GetTxsQuery = { messages: any; is_send: boolean; is_ibc: boolean; + is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -15748,6 +15750,7 @@ export type GetBlockTransactionsByHeightQueryQuery = { messages: any; is_send: boolean; is_ibc: boolean; + is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -15796,6 +15799,7 @@ export type GetModuleTransactionsQueryQuery = { messages: any; is_send: boolean; is_ibc: boolean; + is_opinit: boolean; is_move_execute: boolean; is_move_execute_event: boolean; is_move_publish: boolean; @@ -21963,6 +21967,10 @@ export const GetTxsByPoolIdPaginationDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, + { + kind: "Field", + name: { kind: "Name", value: "is_opinit" }, + }, ], }, }, @@ -22172,6 +22180,7 @@ export const GetTxsDocument = { { kind: "Field", name: { kind: "Name", value: "messages" } }, { kind: "Field", name: { kind: "Name", value: "is_send" } }, { kind: "Field", name: { kind: "Name", value: "is_ibc" } }, + { kind: "Field", name: { kind: "Name", value: "is_opinit" } }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, @@ -22598,6 +22607,7 @@ export const GetBlockTransactionsByHeightQueryDocument = { { kind: "Field", name: { kind: "Name", value: "messages" } }, { kind: "Field", name: { kind: "Name", value: "is_send" } }, { kind: "Field", name: { kind: "Name", value: "is_ibc" } }, + { kind: "Field", name: { kind: "Name", value: "is_opinit" } }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, @@ -23049,6 +23059,10 @@ export const GetModuleTransactionsQueryDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, + { + kind: "Field", + name: { kind: "Name", value: "is_opinit" }, + }, { kind: "Field", name: { kind: "Name", value: "is_move_execute" }, diff --git a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx index e7accd737..073df50b4 100644 --- a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx +++ b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx @@ -37,6 +37,11 @@ export const TxMsgExpand = ({ type.startsWith("/ibc"); let msgIcon: IconKeys = "info-circle"; let content: ReactNode; + const isOPInit = Boolean( + log?.events.find((event) => + event.attributes.find((attr) => attr.value.includes("/opinit")) + ) + ); switch (type) { case "/cosmwasm.wasm.v1.MsgStoreCode": @@ -339,6 +344,11 @@ export const TxMsgExpand = ({ IBC )} + {isOPInit && !isMobile && ( + + OPInit + + )} {isIBC && isMobile && ( @@ -346,6 +356,11 @@ export const TxMsgExpand = ({ IBC )} + {isOPInit && isMobile && ( + + OPInit + + )} Date: Wed, 6 Dec 2023 14:04:56 +0900 Subject: [PATCH 04/16] feat(components): add opinit badge in txs table --- .../components/table/transactions/TransactionsTableRow.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index ad4152e6d..725844c62 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -37,6 +37,11 @@ export const TransactionsTableRow = ({ const { isOpen, onToggle } = useDisclosure(); const isAccordion = transaction.messages.length > 1; + const { messages } = transaction; + const isOpinit = Boolean( + messages.find(({ type }) => type.includes("opinit")) + ); + return ( )} - {transaction.isOpinit && ( + {isOpinit && ( Date: Wed, 6 Dec 2023 14:08:29 +0900 Subject: [PATCH 05/16] fix(components): fix opinit badge logic --- .../tx-details/components/tx-message/TxMsgExpand.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx index 073df50b4..8f7c4064d 100644 --- a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx +++ b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx @@ -37,11 +37,7 @@ export const TxMsgExpand = ({ type.startsWith("/ibc"); let msgIcon: IconKeys = "info-circle"; let content: ReactNode; - const isOPInit = Boolean( - log?.events.find((event) => - event.attributes.find((attr) => attr.value.includes("/opinit")) - ) - ); + const isOpinit = Boolean(type.includes("opinit")); switch (type) { case "/cosmwasm.wasm.v1.MsgStoreCode": @@ -344,7 +340,7 @@ export const TxMsgExpand = ({ IBC )} - {isOPInit && !isMobile && ( + {isOpinit && !isMobile && ( OPInit @@ -356,7 +352,7 @@ export const TxMsgExpand = ({ IBC )} - {isOPInit && isMobile && ( + {isOpinit && isMobile && ( OPInit From 4ec5f3acc6ffed2c7f46109a01b510c3574a7114 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 13:36:12 +0900 Subject: [PATCH 06/16] fix: fix variables name --- CHANGELOG.md | 3 ++- src/lib/app-provider/hooks/index.ts | 1 + src/lib/app-provider/hooks/useInitia.ts | 8 ++++++++ src/lib/components/TxFilterSelection.tsx | 9 ++------- .../table/transactions/TransactionsTableMobileCard.tsx | 2 +- .../table/transactions/TransactionsTableRow.tsx | 4 ++-- src/lib/data/constant.ts | 2 +- .../tx-details/components/tx-message/TxMsgExpand.tsx | 6 +++--- src/lib/services/expression/txExpression.ts | 2 +- src/lib/services/txService.ts | 8 ++++---- src/lib/types/tx/transaction.ts | 4 ++-- src/lib/utils/extractActionValue.ts | 2 +- 12 files changed, 28 insertions(+), 23 deletions(-) create mode 100644 src/lib/app-provider/hooks/useInitia.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 78e2a13be..067d7ed1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- [#648](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia + ### Features - [#633](https://github.com/alleslabs/celatone-frontend/pull/633) Add Amplitude for module detail and breadcrumb @@ -58,7 +60,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Features -- [#647](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia - [#642](https://github.com/alleslabs/celatone-frontend/pull/642) Add stone-12 network - [#629](https://github.com/alleslabs/celatone-frontend/pull/629) Add Amplitude for save account,to save code page count, and to save contract count - [#628](https://github.com/alleslabs/celatone-frontend/pull/628) Add Amplitude for contract states, pagination and contract details diff --git a/src/lib/app-provider/hooks/index.ts b/src/lib/app-provider/hooks/index.ts index 4e3b8f29b..a5cb86e64 100644 --- a/src/lib/app-provider/hooks/index.ts +++ b/src/lib/app-provider/hooks/index.ts @@ -14,3 +14,4 @@ export * from "./useConfig"; export * from "./useCurrentChain"; export * from "./useConvertHexAddress"; export * from "./usePlatform"; +export * from "./useInitia"; diff --git a/src/lib/app-provider/hooks/useInitia.ts b/src/lib/app-provider/hooks/useInitia.ts new file mode 100644 index 000000000..410e301d8 --- /dev/null +++ b/src/lib/app-provider/hooks/useInitia.ts @@ -0,0 +1,8 @@ +import { useCelatoneApp } from "../contexts"; + +export const useInitia = () => { + const { + chainConfig: { chain }, + } = useCelatoneApp(); + return chain === "initia"; +}; diff --git a/src/lib/components/TxFilterSelection.tsx b/src/lib/components/TxFilterSelection.tsx index c98fad4ba..23be235cd 100644 --- a/src/lib/components/TxFilterSelection.tsx +++ b/src/lib/components/TxFilterSelection.tsx @@ -16,11 +16,7 @@ import { matchSorter } from "match-sorter"; import type { CSSProperties } from "react"; import { useMemo, useState, useRef, forwardRef } from "react"; -import { - useCurrentChain, - useMoveConfig, - useWasmConfig, -} from "lib/app-provider"; +import { useInitia, useMoveConfig, useWasmConfig } from "lib/app-provider"; import { CustomIcon } from "lib/components/icon"; import { DEFAULT_BASE_TX_FILTERS, @@ -86,8 +82,7 @@ export const TxFilterSelection = forwardRef< const wasm = useWasmConfig({ shouldRedirect: false }); const move = useMoveConfig({ shouldRedirect: false }); - const { chain } = useCurrentChain(); - const isInitia = chain.bech32_prefix === "init"; + const isInitia = useInitia(); const options = useMemo( () => [ diff --git a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx index 9e40527d6..8ccd34b2a 100644 --- a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx +++ b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx @@ -55,7 +55,7 @@ export const TransactionsTableMobileCard = ({ IBC )} - {transaction.isOpinit && ( + {transaction.isOpInit && ( OPInit diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index 725844c62..10c6871ec 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -38,7 +38,7 @@ export const TransactionsTableRow = ({ const isAccordion = transaction.messages.length > 1; const { messages } = transaction; - const isOpinit = Boolean( + const isOpInit = Boolean( messages.find(({ type }) => type.includes("opinit")) ); @@ -91,7 +91,7 @@ export const TransactionsTableRow = ({ IBC )} - {isOpinit && ( + {isOpInit && ( )} - {isOpinit && !isMobile && ( + {isOpInit && !isMobile && ( OPInit @@ -352,7 +352,7 @@ export const TxMsgExpand = ({ IBC )} - {isOpinit && isMobile && ( + {isOpInit && isMobile && ( OPInit diff --git a/src/lib/services/expression/txExpression.ts b/src/lib/services/expression/txExpression.ts index 42b376af2..fde61fff2 100644 --- a/src/lib/services/expression/txExpression.ts +++ b/src/lib/services/expression/txExpression.ts @@ -7,7 +7,7 @@ import { isTxHash } from "lib/utils"; const actions = { isSend: "is_send", isIbc: "is_ibc", - isOpinit: "is_opinit", + isOpInit: "is_opinit", isExecute: "is_execute", isInstantiate: "is_instantiate", isUpload: "is_store_code", diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index 7b9ce6235..6da224798 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -148,7 +148,7 @@ export const useTxsByAddressPagination = ( transaction.is_signer ), isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, + isOpInit: transaction.transaction.is_opinit, isInstantiate: transaction.transaction.is_instantiate ?? false, })) ); @@ -259,7 +259,7 @@ export const useTxsByPoolIdPagination = ( actionMsgType: ActionMsgType.OTHER_ACTION_MSG, furtherAction: MsgFurtherAction.NONE, isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, + isOpInit: transaction.transaction.is_opinit, isInstantiate: false, })) ); @@ -386,7 +386,7 @@ export const useTxsByBlockHeightPagination = ( ]), furtherAction: MsgFurtherAction.NONE, isIbc: transaction.is_ibc, - isOpinit: transaction.is_opinit, + isOpInit: transaction.is_opinit, isInstantiate: transaction.is_instantiate ?? false, })) ), @@ -471,7 +471,7 @@ export const useModuleTxsByPagination = ({ furtherAction: MsgFurtherAction.NONE, isSigner: false, isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, + isOpInit: transaction.transaction.is_opinit, isInstantiate: false, })) ); diff --git a/src/lib/types/tx/transaction.ts b/src/lib/types/tx/transaction.ts index bd92a661e..ec87e37c4 100644 --- a/src/lib/types/tx/transaction.ts +++ b/src/lib/types/tx/transaction.ts @@ -37,12 +37,12 @@ export interface Transaction { furtherAction: MsgFurtherAction; isIbc: boolean; isInstantiate: boolean; - isOpinit?: boolean; + isOpInit?: boolean; } /* Filter for INITIA */ export interface InitiaTxFilters { - isOpinit: boolean; + isOpInit: boolean; } export interface BaseTxFilters { diff --git a/src/lib/utils/extractActionValue.ts b/src/lib/utils/extractActionValue.ts index 65e2b6468..3b4bf3933 100644 --- a/src/lib/utils/extractActionValue.ts +++ b/src/lib/utils/extractActionValue.ts @@ -4,7 +4,7 @@ export const displayActionValue = (isActionName: string) => { return "Send"; case "isIbc": return "IBC"; - case "isOpinit": + case "isOpInit": return "OPInit"; case "isUpload": return "Upload"; From e8ffe5f6f485019c712280cc0423dff244e05ba5 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 14:10:52 +0900 Subject: [PATCH 07/16] fix: revert variables name --- .../table/transactions/TransactionsTableMobileCard.tsx | 2 +- .../table/transactions/TransactionsTableRow.tsx | 4 ++-- src/lib/data/constant.ts | 2 +- .../tx-details/components/tx-message/TxMsgExpand.tsx | 6 +++--- src/lib/services/expression/txExpression.ts | 2 +- src/lib/services/txService.ts | 8 ++++---- src/lib/types/tx/transaction.ts | 4 ++-- src/lib/utils/extractActionValue.ts | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx index 8ccd34b2a..9e40527d6 100644 --- a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx +++ b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx @@ -55,7 +55,7 @@ export const TransactionsTableMobileCard = ({ IBC )} - {transaction.isOpInit && ( + {transaction.isOpinit && ( OPInit diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index 10c6871ec..725844c62 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -38,7 +38,7 @@ export const TransactionsTableRow = ({ const isAccordion = transaction.messages.length > 1; const { messages } = transaction; - const isOpInit = Boolean( + const isOpinit = Boolean( messages.find(({ type }) => type.includes("opinit")) ); @@ -91,7 +91,7 @@ export const TransactionsTableRow = ({ IBC )} - {isOpInit && ( + {isOpinit && ( )} - {isOpInit && !isMobile && ( + {isOpinit && !isMobile && ( OPInit @@ -352,7 +352,7 @@ export const TxMsgExpand = ({ IBC )} - {isOpInit && isMobile && ( + {isOpinit && isMobile && ( OPInit diff --git a/src/lib/services/expression/txExpression.ts b/src/lib/services/expression/txExpression.ts index 58e2704fe..673341aa6 100644 --- a/src/lib/services/expression/txExpression.ts +++ b/src/lib/services/expression/txExpression.ts @@ -7,7 +7,7 @@ import { isTxHash } from "lib/utils"; const actions = { isSend: "is_send", isIbc: "is_ibc", - isOpInit: "is_opinit", + isOpinit: "is_opinit", isExecute: "is_execute", isInstantiate: "is_instantiate", isStoreCode: "is_store_code", diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index 26a8d6bdd..2c3ad80d8 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -190,7 +190,7 @@ export const useTxsByAddressPagination = ( transaction.is_signer ), isIbc: transaction.transaction.is_ibc, - isOpInit: transaction.transaction.is_opinit, + isOpinit: transaction.transaction.is_opinit, isInstantiate: transaction.transaction.is_instantiate ?? false, })) ); @@ -322,7 +322,7 @@ export const useTxsByPoolIdPagination = ( actionMsgType: ActionMsgType.OTHER_ACTION_MSG, furtherAction: MsgFurtherAction.NONE, isIbc: transaction.transaction.is_ibc, - isOpInit: transaction.transaction.is_opinit, + isOpinit: transaction.transaction.is_opinit, isInstantiate: false, })) ); @@ -436,7 +436,7 @@ export const useTxsByBlockHeightPagination = ( ]), furtherAction: MsgFurtherAction.NONE, isIbc: transaction.is_ibc, - isOpInit: transaction.is_opinit, + isOpinit: transaction.is_opinit, isInstantiate: transaction.is_instantiate ?? false, })) ), @@ -521,7 +521,7 @@ export const useModuleTxsByPagination = ({ furtherAction: MsgFurtherAction.NONE, isSigner: false, isIbc: transaction.transaction.is_ibc, - isOpInit: transaction.transaction.is_opinit, + isOpinit: transaction.transaction.is_opinit, isInstantiate: false, })) ); diff --git a/src/lib/types/tx/transaction.ts b/src/lib/types/tx/transaction.ts index ff93a2a7a..d6f032c20 100644 --- a/src/lib/types/tx/transaction.ts +++ b/src/lib/types/tx/transaction.ts @@ -37,12 +37,12 @@ export interface Transaction { furtherAction: MsgFurtherAction; isIbc: boolean; isInstantiate: boolean; - isOpInit?: boolean; + isOpinit?: boolean; } /* Filter for INITIA */ export interface InitiaTxFilters { - isOpInit: boolean; + isOpinit: boolean; } export interface BaseTxFilters { diff --git a/src/lib/utils/extractActionValue.ts b/src/lib/utils/extractActionValue.ts index cc06608f5..573112254 100644 --- a/src/lib/utils/extractActionValue.ts +++ b/src/lib/utils/extractActionValue.ts @@ -4,7 +4,7 @@ export const displayActionValue = (isActionName: string) => { return "Send"; case "isIbc": return "IBC"; - case "isOpInit": + case "isOpinit": return "OPInit"; case "isStoreCode": return "Store Code"; From a76f4709c779dbdb5733f1693a46fcb5d6213a97 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 14:29:19 +0900 Subject: [PATCH 08/16] fix: fix change log --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1303c6540..ac5854c7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,10 +37,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased -- [#648](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia ### Features +- [#648](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia - [#653](https://github.com/alleslabs/celatone-frontend/pull/653) Migrate from stone-12 to stone-12-1 - [#637](https://github.com/alleslabs/celatone-frontend/pull/637) Add amp module interaction and code snippet property - [#633](https://github.com/alleslabs/celatone-frontend/pull/633) Add amp module detail and breadcrumb From eb45f6ad7d7e9170f0798ed1bd81be3ccba09cbf Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 16:12:44 +0900 Subject: [PATCH 09/16] feat(components): add new enpoints query for transactions --- src/lib/app-provider/env.ts | 1 + src/lib/components/TxFilterSelection.tsx | 4 +- .../transactions/TransactionsTableRow.tsx | 5 +- src/lib/data/constant.ts | 3 +- src/lib/gql/graphql.ts | 19 ---- .../components/tables/ModuleTxsTable.tsx | 16 ++-- src/lib/pages/module-details/index.tsx | 4 + .../components/tx-message/TxMsgExpand.tsx | 2 +- src/lib/services/tx.ts | 95 ++++++++++++++++++- src/lib/services/txService.ts | 52 ++++++++-- src/lib/types/tx/transaction.ts | 3 +- 11 files changed, 159 insertions(+), 45 deletions(-) diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 581cad154..9987ac772 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -91,6 +91,7 @@ export enum CELATONE_QUERY_KEYS { TXS = "CELATONE_QUERY_TXS", TXS_BY_BLOCK_HEIGHT_PAGINATION = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT", TXS_BY_BLOCK_HEIGHT_COUNT = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT_COUNT", + TXS_BY_MODULES = "CELATONE_QUERY_TXS_BY_MODULES", // ICNS ICNS_NAMES_BY_ADDRESS = "CELATONE_QUERY_ICNS_NAMES_BY_ADDRESS", ADDRESS_BY_ICNS_NAME = "CELATONE_QUERY_ADDRESS_BY_ICNS_NAME", diff --git a/src/lib/components/TxFilterSelection.tsx b/src/lib/components/TxFilterSelection.tsx index 23be235cd..820e20667 100644 --- a/src/lib/components/TxFilterSelection.tsx +++ b/src/lib/components/TxFilterSelection.tsx @@ -22,7 +22,7 @@ import { DEFAULT_BASE_TX_FILTERS, DEFAULT_MOVE_TX_FILTERS, DEFAULT_WASM_TX_FILTERS, - INITIA_TX_FILTERS, + DEFAULT_INITIA_TX_FILTERS, } from "lib/data"; import { displayActionValue, mergeRefs } from "lib/utils"; @@ -51,7 +51,7 @@ const listItemProps: CSSProperties = { const BASE_OPTIONS = Object.keys(DEFAULT_BASE_TX_FILTERS); const WASM_OPTIONS = Object.keys(DEFAULT_WASM_TX_FILTERS); const MOVE_OPTIONS = Object.keys(DEFAULT_MOVE_TX_FILTERS); -const INITIA_OPTIONS = Object.keys(INITIA_TX_FILTERS); +const INITIA_OPTIONS = Object.keys(DEFAULT_INITIA_TX_FILTERS); // TODO - Refactor this along with TagSelection export const TxFilterSelection = forwardRef< diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index 725844c62..7830a0a7a 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -37,10 +37,7 @@ export const TransactionsTableRow = ({ const { isOpen, onToggle } = useDisclosure(); const isAccordion = transaction.messages.length > 1; - const { messages } = transaction; - const isOpinit = Boolean( - messages.find(({ type }) => type.includes("opinit")) - ); + const { isOpinit } = transaction; return ( diff --git a/src/lib/data/constant.ts b/src/lib/data/constant.ts index ff1233517..bffee8350 100644 --- a/src/lib/data/constant.ts +++ b/src/lib/data/constant.ts @@ -60,7 +60,7 @@ export const DEFAULT_MOVE_TX_FILTERS: MoveTxFilters = { isMoveScript: false, }; -export const INITIA_TX_FILTERS: InitiaTxFilters = { +export const DEFAULT_INITIA_TX_FILTERS: InitiaTxFilters = { isOpinit: false, }; @@ -68,6 +68,7 @@ export const DEFAULT_TX_FILTERS: TxFilters = { ...DEFAULT_BASE_TX_FILTERS, ...DEFAULT_WASM_TX_FILTERS, ...DEFAULT_MOVE_TX_FILTERS, + ...DEFAULT_INITIA_TX_FILTERS, }; export const UPPERBOUND_COUNT = 10000; diff --git a/src/lib/gql/graphql.ts b/src/lib/gql/graphql.ts index 80a02d56e..f82b77014 100644 --- a/src/lib/gql/graphql.ts +++ b/src/lib/gql/graphql.ts @@ -15625,7 +15625,6 @@ export type GetTxsByAddressPaginationQuery = { messages: any; is_send: boolean; is_ibc: boolean; - is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -15673,7 +15672,6 @@ export type GetTxsByPoolIdPaginationQuery = { success: boolean; messages: any; is_ibc: boolean; - is_opinit: boolean; account: { __typename?: "accounts"; address: string }; }; }>; @@ -15710,7 +15708,6 @@ export type GetTxsQuery = { messages: any; is_send: boolean; is_ibc: boolean; - is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -15750,7 +15747,6 @@ export type GetBlockTransactionsByHeightQueryQuery = { messages: any; is_send: boolean; is_ibc: boolean; - is_opinit: boolean; is_clear_admin?: boolean; is_execute?: boolean; is_instantiate?: boolean; @@ -15799,7 +15795,6 @@ export type GetModuleTransactionsQueryQuery = { messages: any; is_send: boolean; is_ibc: boolean; - is_opinit: boolean; is_move_execute: boolean; is_move_execute_event: boolean; is_move_publish: boolean; @@ -21543,10 +21538,6 @@ export const GetTxsByAddressPaginationDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, - { - kind: "Field", - name: { kind: "Name", value: "is_opinit" }, - }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, @@ -21967,10 +21958,6 @@ export const GetTxsByPoolIdPaginationDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, - { - kind: "Field", - name: { kind: "Name", value: "is_opinit" }, - }, ], }, }, @@ -22180,7 +22167,6 @@ export const GetTxsDocument = { { kind: "Field", name: { kind: "Name", value: "messages" } }, { kind: "Field", name: { kind: "Name", value: "is_send" } }, { kind: "Field", name: { kind: "Name", value: "is_ibc" } }, - { kind: "Field", name: { kind: "Name", value: "is_opinit" } }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, @@ -22607,7 +22593,6 @@ export const GetBlockTransactionsByHeightQueryDocument = { { kind: "Field", name: { kind: "Name", value: "messages" } }, { kind: "Field", name: { kind: "Name", value: "is_send" } }, { kind: "Field", name: { kind: "Name", value: "is_ibc" } }, - { kind: "Field", name: { kind: "Name", value: "is_opinit" } }, { kind: "Field", name: { kind: "Name", value: "is_clear_admin" }, @@ -23059,10 +23044,6 @@ export const GetModuleTransactionsQueryDocument = { kind: "Field", name: { kind: "Name", value: "is_ibc" }, }, - { - kind: "Field", - name: { kind: "Name", value: "is_opinit" }, - }, { kind: "Field", name: { kind: "Name", value: "is_move_execute" }, diff --git a/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx b/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx index 0a2409ccb..33c973a40 100644 --- a/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx +++ b/src/lib/pages/module-details/components/tables/ModuleTxsTable.tsx @@ -6,10 +6,12 @@ import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState } from "lib/components/state"; import { TransactionsTable, ViewMore } from "lib/components/table"; -import { useModuleTxsByPagination } from "lib/services/txService"; -import type { Nullable, Option } from "lib/types"; +import { useTxsByModule } from "lib/services/txService"; +import type { HexAddr, Nullable, Option } from "lib/types"; interface ModuleTxsTableProps { + address: HexAddr; + moduleName: string; moduleId: Option>; txCount: Option; onViewMore?: () => void; @@ -18,6 +20,8 @@ interface ModuleTxsTableProps { } export const ModuleTxsTable = ({ + address, + moduleName, moduleId, txCount, onViewMore, @@ -46,11 +50,7 @@ export const ModuleTxsTable = ({ data: moduleTxs, isLoading, error, - } = useModuleTxsByPagination({ - moduleId, - pageSize, - offset, - }); + } = useTxsByModule(address, moduleName, offset, pageSize); const onPageChange = (nextPage: number) => { refetchCount(); @@ -72,7 +72,7 @@ export const ModuleTxsTable = ({ return ( <> { { axios .get(`${endpoint}`, { @@ -165,6 +174,7 @@ export const getTxs = async ( offset, is_wasm: isWasm, is_move: isMove, + is_initia: isInitia, }, }) .then((res) => zTxsResponse.parse(res.data)); @@ -211,6 +221,7 @@ const zAccountTxsResponseItem = zBaseTxsResponseItem val.is_signer ), isIbc: val.is_ibc, + isOpinit: val.is_opinit, isInstantiate: val.is_instantiate ?? false, })); @@ -227,7 +238,8 @@ export const getTxsByAddress = async ( limit: number, offset: number, isWasm: boolean, - isMove: boolean + isMove: boolean, + isInitia: boolean ) => { const filterParams = camelToSnake(txFilters); @@ -238,6 +250,7 @@ export const getTxsByAddress = async ( offset, is_wasm: isWasm, is_move: isMove, + is_initia: isInitia, ...filterParams, ...(isSigner !== undefined && { is_signer: isSigner }), }, @@ -245,6 +258,82 @@ export const getTxsByAddress = async ( .then((res) => zAccountTxsResponse.parse(res.data)); }; +const zModuleTxsResponseItem = zBaseTxsResponseItem + .extend({ + is_signer: z.boolean().optional(), + }) + .transform((val) => ({ + hash: parseTxHash(val.hash), + messages: snakeToCamel(val.messages), + sender: val.sender, + isSigner: val.is_signer ?? false, + height: val.height, + created: val.created, + success: val.success, + actionMsgType: getActionMsgType([ + val.is_send, + val.is_execute, + val.is_instantiate, + val.is_store_code, + val.is_migrate, + val.is_update_admin, + val.is_clear_admin, + // TODO: implement Move msg type + ]), + furtherAction: getMsgFurtherAction( + val.messages.length, + { + isSend: val.is_send, + isIbc: val.is_ibc, + isExecute: val.is_execute, + isInstantiate: val.is_instantiate, + isStoreCode: val.is_store_code, + isMigrate: val.is_migrate, + isUpdateAdmin: val.is_update_admin, + isClearAdmin: val.is_clear_admin, + isMovePublish: val.is_move_publish, + isMoveUpgrade: val.is_move_upgrade, + isMoveExecute: val.is_move_execute, + isMoveScript: val.is_move_script, + }, + val.success, + val.is_signer ?? false + ), + isIbc: val.is_ibc, + isOpinit: val.is_opinit, + isInstantiate: val.is_instantiate ?? false, + })); + +const zModuleTxsResponse = z.object({ + items: z.array(zModuleTxsResponseItem), +}); + +export const getTxsByModule = async ( + endpoint: string, + address: HexAddr, + moduleName: string, + limit: number, + offset: number, + isWasm: boolean, + isMove: boolean, + isInitia: boolean +) => { + return axios + .get( + `${endpoint}/modules/${encodeURIComponent(address)}/${moduleName}/txs`, + { + params: { + limit, + offset, + is_wasm: isWasm, + is_move: isMove, + is_initia: isInitia, + }, + } + ) + .then((res) => zModuleTxsResponse.parse(res.data)); +}; + const zTxsCountResponse = z .object({ count: z.number().nullish(), diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index 2c3ad80d8..1b7924daa 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -10,6 +10,7 @@ import { CELATONE_QUERY_KEYS, useBaseApiRoute, useCelatoneApp, + useInitia, useMoveConfig, useWasmConfig, } from "lib/app-provider"; @@ -33,6 +34,7 @@ import type { PoolTxFilter, Nullable, HumanAddr, + HexAddr, } from "lib/types"; import { ActionMsgType, MsgFurtherAction } from "lib/types"; import { @@ -51,6 +53,7 @@ import { getTxsByAddress, queryTxData, getAPITxsCountByAddress, + getTxsByModule, } from "./tx"; export interface TxData extends TxResponse { @@ -95,6 +98,7 @@ export const useTxsByAddress = ( const endpoint = useBaseApiRoute("accounts"); const { enabled: isWasm } = useWasmConfig({ shouldRedirect: false }); const { enabled: isMove } = useMoveConfig({ shouldRedirect: false }); + const isInitia = useInitia(); return useQuery( [ @@ -117,7 +121,8 @@ export const useTxsByAddress = ( limit, offset, isWasm, - isMove + isMove, + isInitia ), { retry: 1, refetchOnWindowFocus: false } ); @@ -190,7 +195,6 @@ export const useTxsByAddressPagination = ( transaction.is_signer ), isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, isInstantiate: transaction.transaction.is_instantiate ?? false, })) ); @@ -322,7 +326,6 @@ export const useTxsByPoolIdPagination = ( actionMsgType: ActionMsgType.OTHER_ACTION_MSG, furtherAction: MsgFurtherAction.NONE, isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, isInstantiate: false, })) ); @@ -389,10 +392,12 @@ export const useTxs = ( const endpoint = useBaseApiRoute("txs"); const { enabled: wasmEnable } = useWasmConfig({ shouldRedirect: false }); const { enabled: moveEnable } = useMoveConfig({ shouldRedirect: false }); + const isInitia = useInitia(); return useQuery( [CELATONE_QUERY_KEYS.TXS, endpoint, limit, offset, wasmEnable, moveEnable], - async () => getTxs(endpoint, limit, offset, wasmEnable, moveEnable), + async () => + getTxs(endpoint, limit, offset, wasmEnable, moveEnable, isInitia), { ...options, retry: 1, refetchOnWindowFocus: false } ); }; @@ -436,7 +441,6 @@ export const useTxsByBlockHeightPagination = ( ]), furtherAction: MsgFurtherAction.NONE, isIbc: transaction.is_ibc, - isOpinit: transaction.is_opinit, isInstantiate: transaction.is_instantiate ?? false, })) ), @@ -521,7 +525,6 @@ export const useModuleTxsByPagination = ({ furtherAction: MsgFurtherAction.NONE, isSigner: false, isIbc: transaction.transaction.is_ibc, - isOpinit: transaction.transaction.is_opinit, isInstantiate: false, })) ); @@ -569,3 +572,40 @@ export const useModuleTxsCount = (moduleId: Option>) => { } ); }; + +export const useTxsByModule = ( + address: HexAddr, + moduleName: string, + offset: number, + limit: number +): UseQueryResult => { + const endpoint = useBaseApiRoute("move"); + const { enabled: isWasm } = useWasmConfig({ shouldRedirect: false }); + const { enabled: isMove } = useMoveConfig({ shouldRedirect: false }); + const isInitia = useInitia(); + + return useQuery( + [ + CELATONE_QUERY_KEYS.TXS_BY_MODULES, + endpoint, + address, + moduleName, + limit, + offset, + isWasm, + isMove, + ], + async () => + getTxsByModule( + endpoint, + address, + moduleName, + limit, + offset, + isWasm, + isMove, + isInitia + ), + { retry: 1, refetchOnWindowFocus: false } + ); +}; diff --git a/src/lib/types/tx/transaction.ts b/src/lib/types/tx/transaction.ts index d6f032c20..ee8f93d1d 100644 --- a/src/lib/types/tx/transaction.ts +++ b/src/lib/types/tx/transaction.ts @@ -68,7 +68,8 @@ export interface MoveTxFilters { export interface TxFilters extends BaseTxFilters, WasmTxFilters, - MoveTxFilters {} + MoveTxFilters, + InitiaTxFilters {} export type PoolTxFilter = | "is_all" From 2cd3300d5069b710b38a3bb57c6e84a7ce73d077 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 17:32:09 +0900 Subject: [PATCH 10/16] fix: fix zod rules --- src/lib/app-provider/env.ts | 1 - .../transactions/TransactionsTableRow.tsx | 5 +- .../components/tables/ModuleTxsTable.tsx | 6 +- src/lib/pages/module-details/index.tsx | 2 - src/lib/query/tx.ts | 35 ----------- src/lib/services/tx.ts | 48 +-------------- src/lib/services/txService.ts | 60 +------------------ 7 files changed, 5 insertions(+), 152 deletions(-) diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 9987ac772..581cad154 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -91,7 +91,6 @@ export enum CELATONE_QUERY_KEYS { TXS = "CELATONE_QUERY_TXS", TXS_BY_BLOCK_HEIGHT_PAGINATION = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT", TXS_BY_BLOCK_HEIGHT_COUNT = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT_COUNT", - TXS_BY_MODULES = "CELATONE_QUERY_TXS_BY_MODULES", // ICNS ICNS_NAMES_BY_ADDRESS = "CELATONE_QUERY_ICNS_NAMES_BY_ADDRESS", ADDRESS_BY_ICNS_NAME = "CELATONE_QUERY_ADDRESS_BY_ICNS_NAME", diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index 7830a0a7a..542d1ce30 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -36,9 +36,6 @@ export const TransactionsTableRow = ({ }: TransactionsTableRowProps) => { const { isOpen, onToggle } = useDisclosure(); const isAccordion = transaction.messages.length > 1; - - const { isOpinit } = transaction; - return ( )} - {isOpinit && ( + {transaction.isOpinit && ( >; txCount: Option; onViewMore?: () => void; scrollComponentId?: string; @@ -22,7 +21,6 @@ interface ModuleTxsTableProps { export const ModuleTxsTable = ({ address, moduleName, - moduleId, txCount, onViewMore, scrollComponentId, @@ -75,7 +73,7 @@ export const ModuleTxsTable = ({ transactions={moduleTxs?.items} isLoading={isLoading} emptyState={ - !moduleId || error ? ( + error ? ( { { @@ -412,7 +411,6 @@ export const ModuleDetailsBody = ({ moduleData }: ModuleDetailsBodyProps) => { zAccountTxsResponse.parse(res.data)); }; -const zModuleTxsResponseItem = zBaseTxsResponseItem - .extend({ - is_signer: z.boolean().optional(), - }) - .transform((val) => ({ - hash: parseTxHash(val.hash), - messages: snakeToCamel(val.messages), - sender: val.sender, - isSigner: val.is_signer ?? false, - height: val.height, - created: val.created, - success: val.success, - actionMsgType: getActionMsgType([ - val.is_send, - val.is_execute, - val.is_instantiate, - val.is_store_code, - val.is_migrate, - val.is_update_admin, - val.is_clear_admin, - // TODO: implement Move msg type - ]), - furtherAction: getMsgFurtherAction( - val.messages.length, - { - isSend: val.is_send, - isIbc: val.is_ibc, - isExecute: val.is_execute, - isInstantiate: val.is_instantiate, - isStoreCode: val.is_store_code, - isMigrate: val.is_migrate, - isUpdateAdmin: val.is_update_admin, - isClearAdmin: val.is_clear_admin, - isMovePublish: val.is_move_publish, - isMoveUpgrade: val.is_move_upgrade, - isMoveExecute: val.is_move_execute, - isMoveScript: val.is_move_script, - }, - val.success, - val.is_signer ?? false - ), - isIbc: val.is_ibc, - isOpinit: val.is_opinit, - isInstantiate: val.is_instantiate ?? false, - })); - const zModuleTxsResponse = z.object({ - items: z.array(zModuleTxsResponseItem), + items: z.array(zBaseTxsResponseItem), }); export const getTxsByModule = async ( diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index 1b7924daa..e910e9fc9 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -21,7 +21,6 @@ import { getTxsByPoolIdPagination, getBlockTransactionCountByHeightQueryDocument, getBlockTransactionsByHeightQueryDocument, - getModuleTransactionsQueryDocument, getModuleTransactionsCountQueryDocument, } from "lib/query"; import { createQueryFnWithTimeout } from "lib/query-utils"; @@ -33,7 +32,6 @@ import type { Message, PoolTxFilter, Nullable, - HumanAddr, HexAddr, } from "lib/types"; import { ActionMsgType, MsgFurtherAction } from "lib/types"; @@ -491,62 +489,6 @@ export const useTxsCountByBlockHeight = ( ); }; -export const useModuleTxsByPagination = ({ - moduleId, - pageSize, - offset, -}: { - moduleId: Option>; - pageSize: number; - offset: number; -}) => { - const { indexerGraphClient } = useCelatoneApp(); - - const queryFn = async () => { - if (!moduleId) return []; - return indexerGraphClient - .request(getModuleTransactionsQueryDocument, { - moduleId, - pageSize, - offset, - }) - .then(({ module_transactions }) => - module_transactions.map((transaction) => ({ - hash: parseTxHash(transaction.transaction.hash), - messages: snakeToCamel(transaction.transaction.messages), - sender: transaction.transaction.account.address as HumanAddr, - height: transaction.block.height, - created: parseDate(transaction.block.timestamp), - success: transaction.transaction.success, - actionMsgType: getActionMsgType([ - transaction.transaction.is_send, - // TODO: handle more action Move msg type - ]), - furtherAction: MsgFurtherAction.NONE, - isSigner: false, - isIbc: transaction.transaction.is_ibc, - isInstantiate: false, - })) - ); - }; - - return useQuery( - [ - CELATONE_QUERY_KEYS.MODULE_TXS, - indexerGraphClient, - moduleId, - pageSize, - offset, - ], - createQueryFnWithTimeout(queryFn), - { - enabled: Boolean(moduleId), - retry: 1, - refetchOnWindowFocus: false, - } - ); -}; - export const useModuleTxsCount = (moduleId: Option>) => { const { indexerGraphClient } = useCelatoneApp(); @@ -586,7 +528,7 @@ export const useTxsByModule = ( return useQuery( [ - CELATONE_QUERY_KEYS.TXS_BY_MODULES, + CELATONE_QUERY_KEYS.MODULE_TXS, endpoint, address, moduleName, From 7cf4a96d0068eedca68fae09b1ba5f2a1509eb38 Mon Sep 17 00:00:00 2001 From: James0126 Date: Tue, 12 Dec 2023 17:34:29 +0900 Subject: [PATCH 11/16] chore: fix change log spacing --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac5854c7f..712162103 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased - ### Features - [#648](https://github.com/alleslabs/celatone-frontend/pull/648) Support OPInit transaction in initia From a23f8776089a5931aa58b8d2502a5c4aefdd0c76 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Tue, 12 Dec 2023 16:57:36 +0700 Subject: [PATCH 12/16] fix: misc --- src/lib/services/contractStateService.ts | 8 +------- src/lib/services/tx.ts | 8 ++++---- src/lib/services/txService.ts | 24 +++++++++++++----------- 3 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/lib/services/contractStateService.ts b/src/lib/services/contractStateService.ts index 9b7acaec4..65ca09b4c 100644 --- a/src/lib/services/contractStateService.ts +++ b/src/lib/services/contractStateService.ts @@ -26,13 +26,7 @@ export const useContractStates = ( pageParam ), { - getNextPageParam: (lastPage) => { - if (lastPage.nextKey) { - return lastPage.nextKey; - } - - return false; // No more pages - }, + getNextPageParam: (lastPage) => lastPage.nextKey, refetchOnWindowFocus: false, } ); diff --git a/src/lib/services/tx.ts b/src/lib/services/tx.ts index dce349fbc..7111d7e89 100644 --- a/src/lib/services/tx.ts +++ b/src/lib/services/tx.ts @@ -259,8 +259,9 @@ export const getTxsByAddress = async ( }; const zModuleTxsResponse = z.object({ - items: z.array(zBaseTxsResponseItem), + items: z.array(zTxsResponseItem), }); +export type ModuleTxsResponse = z.infer; export const getTxsByModule = async ( endpoint: string, @@ -271,8 +272,8 @@ export const getTxsByModule = async ( isWasm: boolean, isMove: boolean, isInitia: boolean -) => { - return axios +) => + axios .get( `${endpoint}/modules/${encodeURIComponent(address)}/${moduleName}/txs`, { @@ -286,7 +287,6 @@ export const getTxsByModule = async ( } ) .then((res) => zModuleTxsResponse.parse(res.data)); -}; const zTxsCountResponse = z .object({ diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index e910e9fc9..f3b632303 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -45,7 +45,12 @@ import { } from "lib/utils"; import { usePoolTxExpression, useTxExpression } from "./expression"; -import type { AccountTxsResponse, TxResponse, TxsResponse } from "./tx"; +import type { + AccountTxsResponse, + ModuleTxsResponse, + TxResponse, + TxsResponse, +} from "./tx"; import { getTxs, getTxsByAddress, @@ -92,13 +97,13 @@ export const useTxsByAddress = ( txFilters: TxFilters, offset: number, limit: number -): UseQueryResult => { +) => { const endpoint = useBaseApiRoute("accounts"); const { enabled: isWasm } = useWasmConfig({ shouldRedirect: false }); const { enabled: isMove } = useMoveConfig({ shouldRedirect: false }); const isInitia = useInitia(); - return useQuery( + return useQuery( [ CELATONE_QUERY_KEYS.TXS_BY_ADDRESS, endpoint, @@ -382,17 +387,14 @@ export const useTxsCountByPoolId = ( export const useTxs = ( limit: number, offset: number, - options: Pick< - UseQueryOptions, - "onSuccess" | "onError" - > = {} -): UseQueryResult => { + options: Pick, "onSuccess"> = {} +) => { const endpoint = useBaseApiRoute("txs"); const { enabled: wasmEnable } = useWasmConfig({ shouldRedirect: false }); const { enabled: moveEnable } = useMoveConfig({ shouldRedirect: false }); const isInitia = useInitia(); - return useQuery( + return useQuery( [CELATONE_QUERY_KEYS.TXS, endpoint, limit, offset, wasmEnable, moveEnable], async () => getTxs(endpoint, limit, offset, wasmEnable, moveEnable, isInitia), @@ -520,13 +522,13 @@ export const useTxsByModule = ( moduleName: string, offset: number, limit: number -): UseQueryResult => { +) => { const endpoint = useBaseApiRoute("move"); const { enabled: isWasm } = useWasmConfig({ shouldRedirect: false }); const { enabled: isMove } = useMoveConfig({ shouldRedirect: false }); const isInitia = useInitia(); - return useQuery( + return useQuery( [ CELATONE_QUERY_KEYS.MODULE_TXS, endpoint, From e8b74112f84c9aa8d36190e1b9af5879571e9e57 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Tue, 12 Dec 2023 19:03:36 +0700 Subject: [PATCH 13/16] fix: tag color --- .../transactions/TransactionsTableMobileCard.tsx | 4 ++-- .../table/transactions/TransactionsTableRow.tsx | 7 +------ .../tx-details/components/tx-message/TxMsgExpand.tsx | 12 ++++++------ src/lib/services/tx.ts | 4 +++- src/lib/services/txService.ts | 5 +++++ src/lib/styles/theme/components/tag.ts | 8 ++++++++ src/lib/types/tx/transaction.ts | 2 +- 7 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx index 9e40527d6..9080f78bd 100644 --- a/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx +++ b/src/lib/components/table/transactions/TransactionsTableMobileCard.tsx @@ -51,12 +51,12 @@ export const TransactionsTableMobileCard = ({ {transaction.isIbc && ( - + IBC )} {transaction.isOpinit && ( - + OPInit )} diff --git a/src/lib/components/table/transactions/TransactionsTableRow.tsx b/src/lib/components/table/transactions/TransactionsTableRow.tsx index 542d1ce30..100ca9cc7 100644 --- a/src/lib/components/table/transactions/TransactionsTableRow.tsx +++ b/src/lib/components/table/transactions/TransactionsTableRow.tsx @@ -86,12 +86,7 @@ export const TransactionsTableRow = ({ )} {transaction.isOpinit && ( - + OPInit )} diff --git a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx index e367335a2..cbd134bfb 100644 --- a/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx +++ b/src/lib/pages/tx-details/components/tx-message/TxMsgExpand.tsx @@ -335,25 +335,25 @@ export const TxMsgExpand = ({ mt={{ base: 1, md: 0 }} /> {content} - {isIBC && !isMobile && ( + {!isMobile && isIBC && ( IBC )} - {isOpinit && !isMobile && ( - + {!isMobile && isOpinit && ( + OPInit )} - {isIBC && isMobile && ( + {isMobile && isIBC && ( IBC )} - {isOpinit && isMobile && ( - + {isMobile && isOpinit && ( + OPInit )} diff --git a/src/lib/services/tx.ts b/src/lib/services/tx.ts index 7111d7e89..026738dea 100644 --- a/src/lib/services/tx.ts +++ b/src/lib/services/tx.ts @@ -115,6 +115,7 @@ const zBaseTxsResponseItem = z.object({ success: z.boolean(), is_ibc: z.boolean(), is_send: z.boolean(), + // initia is_opinit: z.boolean().optional(), // wasm is_clear_admin: z.boolean().optional(), @@ -150,6 +151,7 @@ const zTxsResponseItem = zBaseTxsResponseItem.transform((val) => ({ ]), furtherAction: MsgFurtherAction.NONE, isIbc: val.is_ibc, + isOpinit: val.is_opinit ?? false, isInstantiate: val.is_instantiate ?? false, })); @@ -221,7 +223,7 @@ const zAccountTxsResponseItem = zBaseTxsResponseItem val.is_signer ), isIbc: val.is_ibc, - isOpinit: val.is_opinit, + isOpinit: val.is_opinit ?? false, isInstantiate: val.is_instantiate ?? false, })); diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index f3b632303..a654c97c6 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -199,6 +199,8 @@ export const useTxsByAddressPagination = ( ), isIbc: transaction.transaction.is_ibc, isInstantiate: transaction.transaction.is_instantiate ?? false, + // TODO: use API + isOpinit: false, })) ); }, [ @@ -330,6 +332,7 @@ export const useTxsByPoolIdPagination = ( furtherAction: MsgFurtherAction.NONE, isIbc: transaction.transaction.is_ibc, isInstantiate: false, + isOpinit: false, })) ); }, [expression, indexerGraphClient, offset, pageSize]); @@ -442,6 +445,8 @@ export const useTxsByBlockHeightPagination = ( furtherAction: MsgFurtherAction.NONE, isIbc: transaction.is_ibc, isInstantiate: transaction.is_instantiate ?? false, + // TODO: use API + isOpinit: false, })) ), [height, limit, offset, indexerGraphClient, wasmEnable, moveEnable] diff --git a/src/lib/styles/theme/components/tag.ts b/src/lib/styles/theme/components/tag.ts index f85c810b4..143ef1d3b 100644 --- a/src/lib/styles/theme/components/tag.ts +++ b/src/lib/styles/theme/components/tag.ts @@ -4,6 +4,13 @@ import { createMultiStyleConfigHelpers } from "@chakra-ui/react"; const { definePartsStyle, defineMultiStyleConfig } = createMultiStyleConfigHelpers(tagAnatomy.keys); +const teal = definePartsStyle({ + container: { + bg: "#69DEC9", + color: "gray.900", + }, +}); + const accentDark = definePartsStyle({ container: { bg: "accent.dark", @@ -67,6 +74,7 @@ export const Tag = defineMultiStyleConfig({ "primary-light": primaryLight, "accent-dark": accentDark, "accent-darker": accentDarker, + teal, gray, }, defaultProps: { diff --git a/src/lib/types/tx/transaction.ts b/src/lib/types/tx/transaction.ts index ee8f93d1d..0507c8ad0 100644 --- a/src/lib/types/tx/transaction.ts +++ b/src/lib/types/tx/transaction.ts @@ -37,7 +37,7 @@ export interface Transaction { furtherAction: MsgFurtherAction; isIbc: boolean; isInstantiate: boolean; - isOpinit?: boolean; + isOpinit: boolean; } /* Filter for INITIA */ From 5ddc51ae52c604b6ce6a3f8031a09c85b8e8e3b8 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Wed, 13 Dec 2023 18:09:48 +0700 Subject: [PATCH 14/16] fix: block txs opinit --- src/lib/app-provider/env.ts | 3 +- .../components/BlockTxsTable.tsx | 42 +++---- src/lib/services/tx.ts | 27 +++++ src/lib/services/txService.ts | 109 ++++++------------ 4 files changed, 76 insertions(+), 105 deletions(-) diff --git a/src/lib/app-provider/env.ts b/src/lib/app-provider/env.ts index 581cad154..8af8cab38 100644 --- a/src/lib/app-provider/env.ts +++ b/src/lib/app-provider/env.ts @@ -89,8 +89,7 @@ export enum CELATONE_QUERY_KEYS { TXS_BY_ADDRESS_PAGINATION = "CELATONE_QUERY_TXS_BY_ADDRESS_PAGINATION", TXS_BY_ADDRESS_COUNT = "CELATONE_QUERY_TXS_BY_ADDRESS_COUNT", TXS = "CELATONE_QUERY_TXS", - TXS_BY_BLOCK_HEIGHT_PAGINATION = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT", - TXS_BY_BLOCK_HEIGHT_COUNT = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT_COUNT", + TXS_BY_BLOCK_HEIGHT = "CELATONE_QUERY_TXS_BY_BLOCK_HEIGHT", // ICNS ICNS_NAMES_BY_ADDRESS = "CELATONE_QUERY_ICNS_NAMES_BY_ADDRESS", ADDRESS_BY_ICNS_NAME = "CELATONE_QUERY_ADDRESS_BY_ICNS_NAME", diff --git a/src/lib/pages/block-details/components/BlockTxsTable.tsx b/src/lib/pages/block-details/components/BlockTxsTable.tsx index e30aa3f86..a72f5de90 100644 --- a/src/lib/pages/block-details/components/BlockTxsTable.tsx +++ b/src/lib/pages/block-details/components/BlockTxsTable.tsx @@ -1,13 +1,8 @@ -import type { ChangeEvent } from "react"; - import { Pagination } from "lib/components/pagination"; import { usePaginator } from "lib/components/pagination/usePaginator"; import { EmptyState } from "lib/components/state"; import { TransactionsTable } from "lib/components/table"; -import { - useTxsByBlockHeightPagination, - useTxsCountByBlockHeight, -} from "lib/services/txService"; +import { useTxsByBlockHeight } from "lib/services/txService"; const scrollComponentId = "block_tx_table_header"; @@ -16,41 +11,30 @@ interface BlockTxsTableProps { } export const BlockTxsTable = ({ height }: BlockTxsTableProps) => { - const { data: blockTxsCount = 0 } = useTxsCountByBlockHeight(height); const { pagesQuantity, + setTotalData, currentPage, setCurrentPage, pageSize, setPageSize, offset, } = usePaginator({ - total: blockTxsCount, initialState: { pageSize: 10, currentPage: 1, isDisabled: false, }, }); - - const { data: blockTxs, isLoading: isBlockTxsLoading } = - useTxsByBlockHeightPagination(height, pageSize, offset); - - const onPageChange = (nextPage: number) => { - setCurrentPage(nextPage); - }; - - const onPageSizeChange = (e: ChangeEvent) => { - const size = Number(e.target.value); - setPageSize(size); - setCurrentPage(1); - }; + const { data, isLoading } = useTxsByBlockHeight(height, pageSize, offset, { + onSuccess: ({ total }) => setTotalData(total), + }); return ( <> { showRelations={false} showTimestamp={false} /> - {blockTxsCount > 10 && ( + {data && data.total > 10 && ( { + const size = Number(e.target.value); + setPageSize(size); + setCurrentPage(1); + }} /> )} diff --git a/src/lib/services/tx.ts b/src/lib/services/tx.ts index 026738dea..e8f880f75 100644 --- a/src/lib/services/tx.ts +++ b/src/lib/services/tx.ts @@ -260,6 +260,33 @@ export const getTxsByAddress = async ( .then((res) => zAccountTxsResponse.parse(res.data)); }; +const zBlockTxsResponse = z.object({ + items: z.array(zTxsResponseItem), + total: z.number().positive(), +}); +export type BlockTxsResponse = z.infer; + +export const getTxsByBlockHeight = async ( + endpoint: string, + height: number, + limit: number, + offset: number, + isWasm: boolean, + isMove: boolean, + isInitia: boolean +) => + axios + .get(`${endpoint}/${height}/txs`, { + params: { + limit, + offset, + is_wasm: isWasm, + is_move: isMove, + is_initia: isInitia, + }, + }) + .then((res) => zBlockTxsResponse.parse(res.data)); + const zModuleTxsResponse = z.object({ items: z.array(zTxsResponseItem), }); diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index a654c97c6..ff0e27050 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -19,8 +19,6 @@ import { getTxsCountByAddress, getTxsCountByPoolId, getTxsByPoolIdPagination, - getBlockTransactionCountByHeightQueryDocument, - getBlockTransactionsByHeightQueryDocument, getModuleTransactionsCountQueryDocument, } from "lib/query"; import { createQueryFnWithTimeout } from "lib/query-utils"; @@ -50,6 +48,7 @@ import type { ModuleTxsResponse, TxResponse, TxsResponse, + BlockTxsResponse, } from "./tx"; import { getTxs, @@ -57,6 +56,7 @@ import { queryTxData, getAPITxsCountByAddress, getTxsByModule, + getTxsByBlockHeight, } from "./tx"; export interface TxData extends TxResponse { @@ -398,98 +398,55 @@ export const useTxs = ( const isInitia = useInitia(); return useQuery( - [CELATONE_QUERY_KEYS.TXS, endpoint, limit, offset, wasmEnable, moveEnable], + [ + CELATONE_QUERY_KEYS.TXS, + endpoint, + limit, + offset, + wasmEnable, + moveEnable, + isInitia, + ], async () => getTxs(endpoint, limit, offset, wasmEnable, moveEnable, isInitia), { ...options, retry: 1, refetchOnWindowFocus: false } ); }; -export const useTxsByBlockHeightPagination = ( +export const useTxsByBlockHeight = ( height: number, limit: number, - offset: number -): UseQueryResult => { - const { indexerGraphClient } = useCelatoneApp(); + offset: number, + options: Pick, "onSuccess"> = {} +) => { + const endpoint = useBaseApiRoute("blocks"); const { enabled: wasmEnable } = useWasmConfig({ shouldRedirect: false }); const { enabled: moveEnable } = useMoveConfig({ shouldRedirect: false }); + const isInitia = useInitia(); - const queryFn = useCallback( - async () => - indexerGraphClient - .request(getBlockTransactionsByHeightQueryDocument, { - limit, - offset, - height, - isWasm: wasmEnable, - isMove: moveEnable, - }) - .then(({ transactions }) => - transactions.map((transaction) => ({ - hash: parseTxHash(transaction.hash), - messages: snakeToCamel(transaction.messages), - sender: transaction.account.address as Addr, - isSigner: false, - height, - created: parseDate(transaction.block.timestamp), - success: transaction.success, - actionMsgType: getActionMsgType([ - transaction.is_execute, - transaction.is_instantiate, - transaction.is_send, - transaction.is_store_code, - transaction.is_migrate, - transaction.is_update_admin, - transaction.is_clear_admin, - ]), - furtherAction: MsgFurtherAction.NONE, - isIbc: transaction.is_ibc, - isInstantiate: transaction.is_instantiate ?? false, - // TODO: use API - isOpinit: false, - })) - ), - [height, limit, offset, indexerGraphClient, wasmEnable, moveEnable] - ); - - return useQuery( + return useQuery( [ - CELATONE_QUERY_KEYS.TXS_BY_BLOCK_HEIGHT_PAGINATION, - indexerGraphClient, + CELATONE_QUERY_KEYS.TXS_BY_BLOCK_HEIGHT, + endpoint, limit, offset, height, + wasmEnable, + moveEnable, + isInitia, ], - queryFn, - { - keepPreviousData: true, - enabled: !!height, - } - ); -}; - -export const useTxsCountByBlockHeight = ( - height: number -): UseQueryResult> => { - const { indexerGraphClient } = useCelatoneApp(); - - const queryFn = useCallback( async () => - indexerGraphClient - .request(getBlockTransactionCountByHeightQueryDocument, { - height, - }) - .then( - ({ transactions_aggregate }) => - transactions_aggregate.aggregate?.count - ), - [height, indexerGraphClient] - ); - - return useQuery( - [CELATONE_QUERY_KEYS.TXS_BY_BLOCK_HEIGHT_COUNT, indexerGraphClient, height], - queryFn, + getTxsByBlockHeight( + endpoint, + height, + limit, + offset, + wasmEnable, + moveEnable, + isInitia + ), { + ...options, keepPreviousData: true, enabled: !!height, } From af430f5ac0917e690b283cb2f4132d1a6f24b961 Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Thu, 14 Dec 2023 12:02:36 +0700 Subject: [PATCH 15/16] feat: past txs opinit --- .../components/tables/txs/index.tsx | 3 +- src/lib/pages/past-txs/index.tsx | 103 +++++++----------- src/lib/services/tx.ts | 8 +- src/lib/services/txService.ts | 16 ++- 4 files changed, 66 insertions(+), 64 deletions(-) diff --git a/src/lib/pages/account-details/components/tables/txs/index.tsx b/src/lib/pages/account-details/components/tables/txs/index.tsx index 59323c8b2..66085bae6 100644 --- a/src/lib/pages/account-details/components/tables/txs/index.tsx +++ b/src/lib/pages/account-details/components/tables/txs/index.tsx @@ -60,7 +60,7 @@ export const TxsTable = ({ data: rawTxCount, isLoading: isTxCountLoading, refetch: refetchTxsCount, - } = useAPITxsCountByAddress(address, isSigner, filters); + } = useAPITxsCountByAddress(address, undefined, isSigner, filters); const txsCount = rawTxCount ?? undefined; const isTxsCountTimeout = rawTxCount === null; @@ -97,6 +97,7 @@ export const TxsTable = ({ const { data: transactions, isLoading } = useTxsByAddress( address, + undefined, isSigner, filters, offset, diff --git a/src/lib/pages/past-txs/index.tsx b/src/lib/pages/past-txs/index.tsx index ddb5ee307..9a9cdffa7 100644 --- a/src/lib/pages/past-txs/index.tsx +++ b/src/lib/pages/past-txs/index.tsx @@ -5,6 +5,7 @@ import { InputGroup, InputRightElement, } from "@chakra-ui/react"; +import { isNull } from "lodash"; import { useRouter } from "next/router"; import type { ChangeEvent } from "react"; import { useEffect, useMemo } from "react"; @@ -21,10 +22,9 @@ import { TransactionsTableWithWallet } from "lib/components/table"; import { TxFilterSelection } from "lib/components/TxFilterSelection"; import { TxRelationSelection } from "lib/components/TxRelationSelection"; import { DEFAULT_TX_FILTERS } from "lib/data"; -import { useAccountId } from "lib/services/accountService"; import { - useTxsByAddressPagination, - useTxsCountByAddress, + useAPITxsCountByAddress, + useTxsByAddress, } from "lib/services/txService"; import type { HumanAddr, Option, TxFilters } from "lib/types"; @@ -52,16 +52,15 @@ const PastTxs = () => { defaultValues, mode: "all", }); - const pastTxsState = watch(); - const { data: accountId } = useAccountId(address as HumanAddr); - const { data: countTxs = 0 } = useTxsCountByAddress({ - accountId, - search: pastTxsState.search, - filters: pastTxsState.filters, - isSigner: pastTxsState.isSigner, - }); + const { data: rawTxCount } = useAPITxsCountByAddress( + address as HumanAddr, + pastTxsState.search, + pastTxsState.isSigner, + pastTxsState.filters + ); + const txCount = isNull(rawTxCount) ? undefined : rawTxCount; const { pagesQuantity, @@ -71,7 +70,7 @@ const PastTxs = () => { setPageSize, offset, } = usePaginator({ - total: countTxs, + total: txCount, initialState: { pageSize: 10, currentPage: 1, @@ -79,63 +78,45 @@ const PastTxs = () => { }, }); - const { data: txs, isLoading } = useTxsByAddressPagination( - accountId, + const { data: txs, isLoading } = useTxsByAddress( + address as HumanAddr, pastTxsState.search, - pastTxsState.filters, pastTxsState.isSigner, + pastTxsState.filters, offset, pageSize ); - const resetPagination = () => { - setPageSize(10); + const handleOnSearchChange = (e: ChangeEvent) => { setCurrentPage(1); + setValue("search", e.target.value); }; - const setFilter = (filter: string, bool: boolean) => { - resetPagination(); - setValue("filters", { ...pastTxsState.filters, [filter]: bool }); - }; - - const onPageChange = (nextPage: number) => { - setCurrentPage(nextPage); + const handleOnIsSignerChange = (value: Option) => { + setCurrentPage(1); + setValue("isSigner", value); }; - const onPageSizeChange = (e: ChangeEvent) => { - const size = Number(e.target.value); - setPageSize(size); + const handleOnFiltersChange = (filter: string, bool: boolean) => { setCurrentPage(1); + setValue("filters", { ...pastTxsState.filters, [filter]: bool }); }; - const filterSelected = useMemo(() => { - return Object.keys(pastTxsState.filters).reduce( - (acc: string[], key: string) => { + const filterSelected = useMemo( + () => + Object.keys(pastTxsState.filters).reduce((acc: string[], key: string) => { if (pastTxsState.filters[key as keyof typeof pastTxsState.filters]) { acc.push(key); } return acc; - }, - [] - ); - }, [pastTxsState]); + }, []), + [pastTxsState] + ); useEffect(() => { if (router.isReady) track(AmpEvent.TO_PAST_TXS); }, [router.isReady]); - useEffect(() => { - setPageSize(10); - setCurrentPage(1); - }, [ - chainId, - setCurrentPage, - setPageSize, - pastTxsState.search, - pastTxsState.isSigner, - pastTxsState.filters, - ]); - useEffect(() => { reset(); }, [chainId, address, reset]); @@ -155,10 +136,7 @@ const PastTxs = () => { { - setCurrentPage(1); - setValue("search", e.target.value); - }} + onChange={handleOnSearchChange} placeholder={`Search with Transaction Hash${ wasm.enabled ? " or Contract Address" : "" }`} @@ -171,22 +149,19 @@ const PastTxs = () => { { - resetPagination(); - setValue("isSigner", value); - }} + setValue={handleOnIsSignerChange} w="165px" /> 0 || @@ -194,7 +169,9 @@ const PastTxs = () => { filterSelected.length > 0 ? ( ) : ( @@ -206,15 +183,19 @@ const PastTxs = () => { ) } /> - {countTxs > 10 && ( + {!!txCount && txCount > 10 && ( { + const size = Number(e.target.value); + setPageSize(size); + setCurrentPage(1); + }} /> )} diff --git a/src/lib/services/tx.ts b/src/lib/services/tx.ts index e8f880f75..949c7defb 100644 --- a/src/lib/services/tx.ts +++ b/src/lib/services/tx.ts @@ -235,6 +235,7 @@ export type AccountTxsResponse = z.infer; export const getTxsByAddress = async ( endpoint: string, address: Addr, + search: Option, isSigner: Option, txFilters: TxFilters, limit: number, @@ -255,6 +256,7 @@ export const getTxsByAddress = async ( is_initia: isInitia, ...filterParams, ...(isSigner !== undefined && { is_signer: isSigner }), + ...(search !== undefined && { search }), }, }) .then((res) => zAccountTxsResponse.parse(res.data)); @@ -326,8 +328,10 @@ const zTxsCountResponse = z export const getAPITxsCountByAddress = async ( endpoint: string, address: Addr, + search: Option, isSigner: Option, - txFilters: TxFilters + txFilters: TxFilters, + isWasm: boolean ) => { const filterParams = camelToSnake(txFilters); @@ -335,7 +339,9 @@ export const getAPITxsCountByAddress = async ( .get(`${endpoint}/${encodeURIComponent(address)}/txs-count`, { params: { ...filterParams, + is_wasm: isWasm, // only for `searching` contract txs ...(isSigner !== undefined && { is_signer: isSigner }), + ...(search !== undefined && { search }), }, }) .then((res) => zTxsCountResponse.parse(res.data)); diff --git a/src/lib/services/txService.ts b/src/lib/services/txService.ts index ff0e27050..ba2011f56 100644 --- a/src/lib/services/txService.ts +++ b/src/lib/services/txService.ts @@ -93,6 +93,7 @@ export const useTxData = ( export const useTxsByAddress = ( address: Addr, + search: Option, isSigner: Option, txFilters: TxFilters, offset: number, @@ -108,6 +109,7 @@ export const useTxsByAddress = ( CELATONE_QUERY_KEYS.TXS_BY_ADDRESS, endpoint, address, + search, isSigner, JSON.stringify(txFilters), limit, @@ -119,6 +121,7 @@ export const useTxsByAddress = ( getTxsByAddress( endpoint, address, + search, isSigner, txFilters, limit, @@ -284,20 +287,31 @@ export const useTxsCountByAddress = ({ // TODO: this will replace useTxsCountByAddress export const useAPITxsCountByAddress = ( address: Addr, + search: Option, isSigner: Option, txFilters: TxFilters ) => { const endpoint = useBaseApiRoute("accounts"); + const { enabled: wasmEnable } = useWasmConfig({ shouldRedirect: false }); return useQuery( [ CELATONE_QUERY_KEYS.API_TXS_COUNT_BY_ADDRESS, endpoint, address, + search, isSigner, JSON.stringify(txFilters), ], - async () => getAPITxsCountByAddress(endpoint, address, isSigner, txFilters), + async () => + getAPITxsCountByAddress( + endpoint, + address, + search, + isSigner, + txFilters, + wasmEnable + ), { retry: 1, refetchOnWindowFocus: false } ); }; From 0b8e50bc784764fe90459fb59e6e99369e0d43ed Mon Sep 17 00:00:00 2001 From: songwongtp <16089160+songwongtp@users.noreply.github.com> Date: Thu, 14 Dec 2023 14:37:52 +0700 Subject: [PATCH 16/16] fix: refactor --- src/lib/pages/past-txs/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/pages/past-txs/index.tsx b/src/lib/pages/past-txs/index.tsx index 9a9cdffa7..67f042561 100644 --- a/src/lib/pages/past-txs/index.tsx +++ b/src/lib/pages/past-txs/index.tsx @@ -5,7 +5,6 @@ import { InputGroup, InputRightElement, } from "@chakra-ui/react"; -import { isNull } from "lodash"; import { useRouter } from "next/router"; import type { ChangeEvent } from "react"; import { useEffect, useMemo } from "react"; @@ -60,7 +59,7 @@ const PastTxs = () => { pastTxsState.isSigner, pastTxsState.filters ); - const txCount = isNull(rawTxCount) ? undefined : rawTxCount; + const txCount = rawTxCount ?? undefined; const { pagesQuantity,