From 53c0834083ce6514de3e6571e26a820ed7864676 Mon Sep 17 00:00:00 2001 From: Anastasiia Date: Tue, 21 Jan 2025 21:09:22 +0100 Subject: [PATCH 1/4] feat: implement arbitrary redo action --- .../v5/common/ActionSidebar/consts.ts | 1 + .../ArbitraryTransaction.tsx | 52 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/consts.ts b/src/components/v5/common/ActionSidebar/consts.ts index 336bdac431..ff8727e739 100644 --- a/src/components/v5/common/ActionSidebar/consts.ts +++ b/src/components/v5/common/ActionSidebar/consts.ts @@ -29,6 +29,7 @@ export const MANAGE_MEMBERS_FIELD_NAME = 'manageMembers'; export const COLONY_NAME_FIELD_NAME = 'colonyName'; export const COLONY_AVATAR_FIELD_NAME = 'avatar'; export const COLONY_DESCRIPTION_FIELD_NAME = 'colonyDescription'; +export const ARBITRARY_TRANSACTIONS_FIELD_NAME = 'transactions'; export const COLONY_OBJECTIVE_TITLE_FIELD_NAME = 'colonyObjectiveTitle'; export const COLONY_OBJECTIVE_DESCRIPTION_FIELD_NAME = 'colonyObjectiveDescription'; diff --git a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/ArbitraryTransaction.tsx b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/ArbitraryTransaction.tsx index debfc20956..738509d263 100644 --- a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/ArbitraryTransaction.tsx +++ b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/ArbitraryTransaction.tsx @@ -1,8 +1,20 @@ import React, { type FC } from 'react'; +import { Action } from '~constants/actions.ts'; import { type ColonyAction, ColonyActionType } from '~types/graphql.ts'; -import { getFormatValuesArbitraryTransactions } from '~utils/arbitraryTxs.ts'; +import { + decodeArbitraryTransaction, + getFormatValuesArbitraryTransactions, +} from '~utils/arbitraryTxs.ts'; import { formatText } from '~utils/intl.ts'; +import { + ACTION_TYPE_FIELD_NAME, + ARBITRARY_TRANSACTIONS_FIELD_NAME, + DECISION_METHOD_FIELD_NAME, + DESCRIPTION_FIELD_NAME, + TITLE_FIELD_NAME, +} from '~v5/common/ActionSidebar/consts.ts'; +import { useDecisionMethod } from '~v5/common/CompletedAction/hooks.ts'; import UserInfoPopover from '~v5/shared/UserInfoPopover/UserInfoPopover.tsx'; import ArbitraryTransactionsTable from '../ArbitraryTransactionsTable/index.ts'; @@ -24,6 +36,7 @@ interface ArbitraryTransactionProps { } const ArbitraryTransaction: FC = ({ action }) => { + const decisionMethod = useDecisionMethod(action); const { customTitle = formatText( { @@ -34,7 +47,31 @@ const ArbitraryTransaction: FC = ({ action }) => { }, ), } = action?.metadata || {}; - const { initiatorUser, transactionHash } = action; + const { initiatorUser, transactionHash, annotation, arbitraryTransactions } = + action; + + const decodedArbitraryTransactions = arbitraryTransactions?.map( + ({ contractAddress, encodedFunction }) => { + const abi = action.metadata?.arbitraryTxAbis?.find( + (abiItem) => abiItem.contractAddress === contractAddress, + ); + if (!abi) { + return { + contractAddress, + }; + } + + const decodedTx = decodeArbitraryTransaction( + abi.jsonAbi, + encodedFunction, + ); + return { + contractAddress, + jsonAbi: abi, + ...decodedTx, + }; + }, + ); const arbitraryMessageValues = getFormatValuesArbitraryTransactions(action); @@ -42,7 +79,16 @@ const ArbitraryTransaction: FC = ({ action }) => { <>
{customTitle} - +
{formatText( From d8a7d3d06983b75f43a01eae6ef28169487a7ac5 Mon Sep 17 00:00:00 2001 From: Anastasiia Date: Wed, 22 Jan 2025 11:16:39 +0100 Subject: [PATCH 2/4] fix: refactor decoding arbitrary to make it work --- .../partials/ArbitraryTxsDescription.tsx | 2 +- .../ArbitraryTransaction.tsx | 38 ++++---------- .../partials/ArbitraryTransaction/hooks.ts | 52 ++++++++++++++++--- .../ArbitraryTransactionsTable.tsx | 23 ++------ .../ArbitraryTransactionsTable/hooks.tsx | 38 ++++---------- src/utils/arbitraryTxs.ts | 9 ++-- 6 files changed, 75 insertions(+), 87 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/ActionSidebarDescription/partials/ArbitraryTxsDescription.tsx b/src/components/v5/common/ActionSidebar/partials/ActionSidebarDescription/partials/ArbitraryTxsDescription.tsx index f71ddc5790..17bdbdf7d7 100644 --- a/src/components/v5/common/ActionSidebar/partials/ActionSidebarDescription/partials/ArbitraryTxsDescription.tsx +++ b/src/components/v5/common/ActionSidebar/partials/ActionSidebarDescription/partials/ArbitraryTxsDescription.tsx @@ -16,7 +16,7 @@ export const ArbitraryTxsDescription = () => { const { transactions } = formValues; const firstArbitraryMethodName = - transactions?.[0]?.method.replace(/\s*\([^)]*\)/g, '') || ''; + transactions?.[0]?.method?.replace(/\s*\([^)]*\)/g, '') || ''; return ( = ({ action }) => { }, ), } = action?.metadata || {}; - const { initiatorUser, transactionHash, annotation, arbitraryTransactions } = - action; - - const decodedArbitraryTransactions = arbitraryTransactions?.map( - ({ contractAddress, encodedFunction }) => { - const abi = action.metadata?.arbitraryTxAbis?.find( - (abiItem) => abiItem.contractAddress === contractAddress, - ); - if (!abi) { - return { - contractAddress, - }; - } + const { initiatorUser, transactionHash, annotation } = action; - const decodedTx = decodeArbitraryTransaction( - abi.jsonAbi, - encodedFunction, - ); - return { - contractAddress, - jsonAbi: abi, - ...decodedTx, - }; - }, + const data = useTransformArbitraryTransactions( + action.arbitraryTransactions || [], + action, ); const arbitraryMessageValues = getFormatValuesArbitraryTransactions(action); @@ -86,7 +66,7 @@ const ArbitraryTransaction: FC = ({ action }) => { [ACTION_TYPE_FIELD_NAME]: Action.ArbitraryTxs, [DECISION_METHOD_FIELD_NAME]: decisionMethod, [DESCRIPTION_FIELD_NAME]: annotation?.message, - [ARBITRARY_TRANSACTIONS_FIELD_NAME]: decodedArbitraryTransactions, + [ARBITRARY_TRANSACTIONS_FIELD_NAME]: data, }} /> @@ -124,7 +104,7 @@ const ArbitraryTransaction: FC = ({ action }) => { )} - + ); }; diff --git a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts index 0793a8573b..21b8c32ae1 100644 --- a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts +++ b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts @@ -2,15 +2,51 @@ import { type ColonyActionFragment, type ColonyActionArbitraryTransaction, } from '~gql'; +import { + decodeArbitraryTransaction, + type DecodedArbitraryTransaction, +} from '~utils/arbitraryTxs.ts'; + +export interface CompletedArbitraryTransactions + extends Partial { + encodedFunction?: string; + contractAddress: string; + jsonAbi?: string; +} -export const useModifyArbitraryTransaction = ( +export const useTransformArbitraryTransactions = ( data: ColonyActionArbitraryTransaction[], action: ColonyActionFragment, -): (ColonyActionArbitraryTransaction & { action: ColonyActionFragment })[] => { - return data?.map((transaction) => { - return { - ...transaction, - action, - }; - }); +): CompletedArbitraryTransactions[] => { + const decodedArbitraryTransactions = data?.map( + ({ contractAddress, encodedFunction }) => { + const abi = action.metadata?.arbitraryTxAbis?.find( + (abiItem) => abiItem.contractAddress === contractAddress, + ); + if (!abi) { + return { + contractAddress, + encodedFunction, + }; + } + + const decodedTx = decodeArbitraryTransaction( + abi.jsonAbi, + encodedFunction, + ); + if (!decodedTx) { + return { + contractAddress, + encodedFunction, + jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), + }; + } + return { + contractAddress, + jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), + ...decodedTx, + }; + }, + ); + return decodedArbitraryTransactions; }; diff --git a/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/ArbitraryTransactionsTable.tsx b/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/ArbitraryTransactionsTable.tsx index 2b38ce2111..731fafa367 100644 --- a/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/ArbitraryTransactionsTable.tsx +++ b/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/ArbitraryTransactionsTable.tsx @@ -1,44 +1,31 @@ import React, { type FC } from 'react'; -import { - type ColonyActionArbitraryTransaction, - type ColonyActionFragment, -} from '~gql'; import { useTablet } from '~hooks/index.ts'; import { formatText } from '~utils/intl.ts'; import { Table } from '~v5/common/Table/Table.tsx'; -import { useModifyArbitraryTransaction } from '../ArbitraryTransaction/hooks.ts'; +import { type CompletedArbitraryTransactions } from '../ArbitraryTransaction/hooks.ts'; import { displayName } from './const.ts'; import { useArbitraryTxsTableColumns } from './hooks.tsx'; -export type ArbitraryTransactionsTableItem = - ColonyActionArbitraryTransaction & { - action: ColonyActionFragment; - }; interface ArbitraryTransactionsTableProps { - action: ColonyActionFragment; + data: CompletedArbitraryTransactions[]; } const ArbitraryTransactionsTable: FC = ({ - action, + data, }) => { const isTablet = useTablet(); const columns = useArbitraryTxsTableColumns(); - const data = useModifyArbitraryTransaction( - action.arbitraryTransactions || [], - action, - ); - return (
{formatText({ id: 'actionSidebar.transactions' })}
- + layout={isTablet ? 'vertical' : 'horizontal'} className="mb-6" columns={columns} @@ -47,7 +34,7 @@ const ArbitraryTransactionsTable: FC = ({ visible: true, }} rows={{ getRowClassName: () => 'align-top' }} - data={data.length === 0 ? [{} as ArbitraryTransactionsTableItem] : data} + data={data.length === 0 ? [{} as CompletedArbitraryTransactions] : data} />
); diff --git a/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/hooks.tsx b/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/hooks.tsx index 6993840a9c..4b8b21709f 100644 --- a/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/hooks.tsx +++ b/src/components/v5/common/CompletedAction/partials/ArbitraryTransactionsTable/hooks.tsx @@ -4,14 +4,14 @@ import React, { useMemo } from 'react'; import { useTablet } from '~hooks/index.ts'; import getMaskedAddress from '~shared/MaskedAddress/getMaskedAddress.ts'; -import { decodeArbitraryTransaction } from '~utils/arbitraryTxs.ts'; import { formatText } from '~utils/intl.ts'; import CellDescription, { type CellDescriptionItem, } from '~v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/ArbitraryTransactionsTable/CellDescription.tsx'; import UserAvatar from '~v5/shared/UserAvatar/UserAvatar.tsx'; -import { type ArbitraryTransactionsTableItem } from './ArbitraryTransactionsTable.tsx'; +import { type CompletedArbitraryTransactions } from '../ArbitraryTransaction/hooks.ts'; + import { EncodedTransactionCell } from './EncodedTransactionCell.tsx'; const getValueByType = ({ type, value, isFull }) => { @@ -27,16 +27,16 @@ const getValueByType = ({ type, value, isFull }) => { }; export const useArbitraryTxsTableColumns = (): ColumnDef< - ArbitraryTransactionsTableItem, + CompletedArbitraryTransactions, string >[] => { const columnHelper = useMemo( - () => createColumnHelper(), + () => createColumnHelper(), [], ); const isTablet = useTablet(); - const columns: ColumnDef[] = useMemo( + const columns: ColumnDef[] = useMemo( () => [ columnHelper.accessor('contractAddress', { enableSorting: false, @@ -75,25 +75,7 @@ export const useArbitraryTxsTableColumns = (): ColumnDef< cell: ({ row: { original: transaction } }) => { const data: CellDescriptionItem[] = []; - const abi = transaction.action.metadata?.arbitraryTxAbis?.find( - (abiItem) => - abiItem.contractAddress === transaction.contractAddress, - ); - - if (!abi) { - return ( - - ); - } - - const decodedTx = decodeArbitraryTransaction( - abi.jsonAbi, - transaction.encodedFunction, - ); - - if (!decodedTx) { + if (transaction.encodedFunction) { return ( { + if (transaction.args) { + transaction.args?.forEach(({ name, type, value }) => { data.push({ name: `${name} (${type})`, value: getValueByType({ diff --git a/src/utils/arbitraryTxs.ts b/src/utils/arbitraryTxs.ts index 2212493475..cacd32b1f8 100644 --- a/src/utils/arbitraryTxs.ts +++ b/src/utils/arbitraryTxs.ts @@ -4,7 +4,7 @@ import { type ColonyActionFragment } from '~gql'; import { type ActionTitleMessageKeys } from '../components/common/ColonyActions/helpers/getActionTitleValues.ts'; -interface DecodedArbitraryTransaction { +export interface DecodedArbitraryTransaction { method: string; args: Array<{ name: string; value: string; type: string }>; } @@ -43,7 +43,7 @@ export const decodeArbitraryTransaction = ( ); return { - method: functionFragment.name, + method: `${functionFragment.name}(${functionFragment.inputs.map((input) => input.type).join(',')})`, args: decodedArgs.map((arg, index) => ({ name: functionArgs[index].name, value: parseValue(arg), @@ -99,7 +99,10 @@ export const getFormatValuesArbitraryTransactions = ( arbitraryTransactions[0].encodedFunction, ); if (decoded?.method) { - messageValues.arbitraryMethod = decoded?.method; + messageValues.arbitraryMethod = decoded?.method.replace( + /\s*\([^)]*\)/g, + '', + ); } else { messageValues.arbitraryTransactionsLength = 0; messageValues.arbitraryMethod = ''; From 2e8dfb73af820e8a7f6e8d55af4feb8a4f255c3b Mon Sep 17 00:00:00 2001 From: Anastasiia Date: Wed, 22 Jan 2025 14:45:15 +0100 Subject: [PATCH 3/4] feat: cover arbitrary redo noABI and noDecoded cases --- .../AddTransactionModal/DynamicInputs.tsx | 6 +- .../AddTransactionModal/useGenerateABI.ts | 57 +++++++++++++------ 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/DynamicInputs.tsx b/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/DynamicInputs.tsx index 7d77cb48b8..d252c4e361 100644 --- a/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/DynamicInputs.tsx +++ b/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/DynamicInputs.tsx @@ -78,9 +78,11 @@ export const DynamicInputs: React.FC = () => { useEffect(() => { // Initial render for "edit" state when we have defaultValues - if (jsonAbiField && selectedMethod) { + if (jsonAbiField) { methodOptionsSetter({ jsonAbi: jsonAbiField }); - methodArgsSetter({ jsonAbi: jsonAbiField, method: selectedMethod }); + if (selectedMethod) { + methodArgsSetter({ jsonAbi: jsonAbiField, method: selectedMethod }); + } } // This hook is intentionally called only for the first render // Other updates will be handled in the "watch" subscription diff --git a/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/useGenerateABI.ts b/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/useGenerateABI.ts index b62e5a2170..f197793ef5 100644 --- a/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/useGenerateABI.ts +++ b/src/components/v5/common/ActionSidebar/partials/forms/ArbitraryTxsForm/partials/AddTransactionModal/useGenerateABI.ts @@ -15,21 +15,8 @@ export const useGenerateABI = ({ setContractAbiLoading }) => { const [isJsonAbiFormatted, setIsJsonAbiFormatted] = useState(false); const [showJsonAbiEditWarning, setShowJsonAbiEditWarning] = useState(false); - useEffect(() => { - const { unsubscribe } = watch( - ({ contractAddress: contractAddressField }, { name }) => { - if (name === 'contractAddress' && isAddress(contractAddressField)) { - getABIFromContractAddress(contractAddressField); - - // Reset jsonAbi state if contractAddress is updated - // jsonAbi will be filled with data after a successful ABI response - setValue('jsonAbi', ''); - setIsJsonAbiFormatted(false); - } - }, - ); - - async function getABIFromContractAddress(contractAddress: string) { + const getABIFromContractAddress = useCallback( + async (contractAddress: string) => { if (!networkInfo?.chainId) { return; } @@ -57,12 +44,48 @@ export const useGenerateABI = ({ setContractAbiLoading }) => { // eslint-disable-next-line no-console console.log(e); } - } + }, + [networkInfo?.chainId, setContractAbiLoading, setValue, trigger], + ); + + useEffect(() => { + const { unsubscribe } = watch( + ({ contractAddress: contractAddressField }, { name }) => { + if (name === 'contractAddress' && isAddress(contractAddressField)) { + getABIFromContractAddress(contractAddressField); + + // Reset jsonAbi state if contractAddress is updated + // jsonAbi will be filled with data after a successful ABI response + setValue('jsonAbi', ''); + setIsJsonAbiFormatted(false); + } + }, + ); return () => unsubscribe(); - }, [watch, networkInfo?.chainId, setContractAbiLoading, setValue, trigger]); + }, [ + watch, + networkInfo?.chainId, + setContractAbiLoading, + setValue, + trigger, + getABIFromContractAddress, + ]); const jsonAbiField = watch('jsonAbi'); + const contractAddressField = watch('contractAddress'); + + useEffect(() => { + // Initial ABI loading in case there is no ABI after REDO action + if ( + contractAddressField && + isAddress(contractAddressField) && + !jsonAbiField + ) { + getABIFromContractAddress(contractAddressField); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const toggleJsonFormat = useCallback(() => { try { From 23eb4e317015fd52d94304c6045f4d90b442d84b Mon Sep 17 00:00:00 2001 From: Anastasiia Date: Thu, 23 Jan 2025 15:29:05 +0100 Subject: [PATCH 4/4] feat: implement redo arbitrary for activity table --- .../ActionSidebar/hooks/useGetActionData.ts | 16 ++++++ .../partials/ArbitraryTransaction/hooks.ts | 34 +------------ src/utils/arbitraryTxs.ts | 51 ++++++++++++++----- 3 files changed, 55 insertions(+), 46 deletions(-) diff --git a/src/components/v5/common/ActionSidebar/hooks/useGetActionData.ts b/src/components/v5/common/ActionSidebar/hooks/useGetActionData.ts index bf9a07642b..31b612210b 100644 --- a/src/components/v5/common/ActionSidebar/hooks/useGetActionData.ts +++ b/src/components/v5/common/ActionSidebar/hooks/useGetActionData.ts @@ -11,6 +11,7 @@ import { useGetAllTokens } from '~hooks/useGetAllTokens.ts'; import { convertRolesToArray } from '~transformers/index.ts'; import { DecisionMethod, ExtendedColonyActionType } from '~types/actions.ts'; import { Authority } from '~types/authority.ts'; +import { getDecodedArbitraryTransactions } from '~utils/arbitraryTxs.ts'; import { getExtendedActionType } from '~utils/colonyActions.ts'; import { convertToDecimal } from '~utils/convertToDecimal.ts'; import { convertPeriodToHours } from '~utils/extensions.ts'; @@ -23,6 +24,7 @@ import { import { ACTION_TYPE_FIELD_NAME, AMOUNT_FIELD_NAME, + ARBITRARY_TRANSACTIONS_FIELD_NAME, FROM_FIELD_NAME, RECIPIENT_FIELD_NAME, TEAM_FIELD_NAME, @@ -70,6 +72,7 @@ const useGetActionData = (transactionId: string | undefined) => { isMotion, roles, colony, + arbitraryTransactions, } = action; const { metadata: expenditureMetadata, slots } = expenditure || {}; @@ -384,6 +387,19 @@ const useGetActionData = (transactionId: string | undefined) => { ...repeatableFields, }; } + case ColonyActionType.MakeArbitraryTransaction: + case ColonyActionType.MakeArbitraryTransactionsMotion: + case ColonyActionType.MakeArbitraryTransactionsMultisig: { + const decodedArbitraryTransactions = getDecodedArbitraryTransactions( + arbitraryTransactions || [], + action, + ); + return { + [ACTION_TYPE_FIELD_NAME]: Action.ArbitraryTxs, + [ARBITRARY_TRANSACTIONS_FIELD_NAME]: decodedArbitraryTransactions, + ...repeatableFields, + }; + } default: return undefined; } diff --git a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts index 21b8c32ae1..f2a26fabaf 100644 --- a/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts +++ b/src/components/v5/common/CompletedAction/partials/ArbitraryTransaction/hooks.ts @@ -3,7 +3,7 @@ import { type ColonyActionArbitraryTransaction, } from '~gql'; import { - decodeArbitraryTransaction, + getDecodedArbitraryTransactions, type DecodedArbitraryTransaction, } from '~utils/arbitraryTxs.ts'; @@ -18,35 +18,5 @@ export const useTransformArbitraryTransactions = ( data: ColonyActionArbitraryTransaction[], action: ColonyActionFragment, ): CompletedArbitraryTransactions[] => { - const decodedArbitraryTransactions = data?.map( - ({ contractAddress, encodedFunction }) => { - const abi = action.metadata?.arbitraryTxAbis?.find( - (abiItem) => abiItem.contractAddress === contractAddress, - ); - if (!abi) { - return { - contractAddress, - encodedFunction, - }; - } - - const decodedTx = decodeArbitraryTransaction( - abi.jsonAbi, - encodedFunction, - ); - if (!decodedTx) { - return { - contractAddress, - encodedFunction, - jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), - }; - } - return { - contractAddress, - jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), - ...decodedTx, - }; - }, - ); - return decodedArbitraryTransactions; + return getDecodedArbitraryTransactions(data, action); }; diff --git a/src/utils/arbitraryTxs.ts b/src/utils/arbitraryTxs.ts index cacd32b1f8..b5aa420bd7 100644 --- a/src/utils/arbitraryTxs.ts +++ b/src/utils/arbitraryTxs.ts @@ -1,6 +1,9 @@ import { Interface } from 'ethers/lib/utils'; -import { type ColonyActionFragment } from '~gql'; +import { + type ColonyActionArbitraryTransaction, + type ColonyActionFragment, +} from '~gql'; import { type ActionTitleMessageKeys } from '../components/common/ColonyActions/helpers/getActionTitleValues.ts'; @@ -56,21 +59,41 @@ export const decodeArbitraryTransaction = ( } }; -export const getDecodedArbitraryTransaction = (transaction) => { - const abi = transaction.action.metadata?.arbitraryTxAbis?.find( - (abiItem) => abiItem.contractAddress === transaction.contractAddress, - ); - - if (!abi) { - return {}; - } +export const getDecodedArbitraryTransactions = ( + data: ColonyActionArbitraryTransaction[], + action: ColonyActionFragment, +) => { + const decodedArbitraryTransactions = data?.map( + ({ contractAddress, encodedFunction }) => { + const abi = action.metadata?.arbitraryTxAbis?.find( + (abiItem) => abiItem.contractAddress === contractAddress, + ); + if (!abi) { + return { + contractAddress, + encodedFunction, + }; + } - const decodedTx = decodeArbitraryTransaction( - abi.jsonAbi, - transaction.encodedFunction, + const decodedTx = decodeArbitraryTransaction( + abi.jsonAbi, + encodedFunction, + ); + if (!decodedTx) { + return { + contractAddress, + encodedFunction, + jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), + }; + } + return { + contractAddress, + jsonAbi: JSON.stringify(JSON.parse(abi.jsonAbi)), + ...decodedTx, + }; + }, ); - - return decodedTx; + return decodedArbitraryTransactions; }; type ArbitraryFormatMessageValues = {