From a85b4d33a4d5443920018d69a6eca821bfc6a7fb Mon Sep 17 00:00:00 2001 From: Petar Todorovic Date: Mon, 7 Apr 2025 15:26:20 +0200 Subject: [PATCH] refactor: remove unused multi-sign transaction logic and clean up wallet type definitions --- .changeset/vast-ants-allow.md | 5 + packages/widget/src/domain/index.ts | 3 - .../widget/src/domain/types/connectors.ts | 4 - packages/widget/src/domain/types/wallet.ts | 6 - .../steps/hooks/use-steps-machine.hook.ts | 108 +----------------- .../widget/src/providers/sk-wallet/index.tsx | 108 ++++++++---------- 6 files changed, 60 insertions(+), 174 deletions(-) create mode 100644 .changeset/vast-ants-allow.md diff --git a/.changeset/vast-ants-allow.md b/.changeset/vast-ants-allow.md new file mode 100644 index 00000000..f40b46e0 --- /dev/null +++ b/.changeset/vast-ants-allow.md @@ -0,0 +1,5 @@ +--- +"@stakekit/widget": patch +--- + +refactor: remove unused multi-sign transaction logic and clean up wallet type definitions diff --git a/packages/widget/src/domain/index.ts b/packages/widget/src/domain/index.ts index f5729969..84c81777 100644 --- a/packages/widget/src/domain/index.ts +++ b/packages/widget/src/domain/index.ts @@ -130,9 +130,6 @@ export const transactionsForConstructOnlySet = new Set([ "LUGANODES_EXIT_REQUEST", ]); -export const getTransactionsForMultiSign = (txs: TransactionDto[]) => - txs.filter((tx) => !transactionsForConstructOnlySet.has(tx.type)); - export const skNormalizeChainId = (chainId: string) => { const cId = normalizeChainId(chainId); diff --git a/packages/widget/src/domain/types/connectors.ts b/packages/widget/src/domain/types/connectors.ts index 218ea05d..d858921c 100644 --- a/packages/widget/src/domain/types/connectors.ts +++ b/packages/widget/src/domain/types/connectors.ts @@ -20,7 +20,3 @@ export const shouldShowDisconnect = (connector: Connector) => !isExternalProviderConnector(connector) && !isLedgerLiveConnector(connector) && !isSafeConnector(connector); - -export const shouldMultiSend: (conn: Connector) => boolean = ( - connector: Connector -) => isSafeConnector(connector); diff --git a/packages/widget/src/domain/types/wallet.ts b/packages/widget/src/domain/types/wallet.ts index 2b18c019..65b6f035 100644 --- a/packages/widget/src/domain/types/wallet.ts +++ b/packages/widget/src/domain/types/wallet.ts @@ -24,12 +24,6 @@ export type SKWallet = { TransactionDecodeError | SendTransactionError, { signedTx: SignedTxOrMessage; broadcasted: boolean } >; - signMultipleTransactions: (args: { - txs: NonNullable[]; - }) => EitherAsync< - TransactionDecodeError | SendTransactionError, - { signedTx: SignedTxOrMessage; broadcasted: boolean } - >; signMessage: (message: string) => EitherAsync; additionalAddresses: AddressWithTokenDtoAdditionalAddresses | null; isLedgerLive: boolean; diff --git a/packages/widget/src/pages/steps/hooks/use-steps-machine.hook.ts b/packages/widget/src/pages/steps/hooks/use-steps-machine.hook.ts index f305f606..07354b80 100644 --- a/packages/widget/src/pages/steps/hooks/use-steps-machine.hook.ts +++ b/packages/widget/src/pages/steps/hooks/use-steps-machine.hook.ts @@ -1,4 +1,3 @@ -import { shouldMultiSend } from "@sk-widget/domain/types/connectors"; import { useSavedRef } from "@sk-widget/hooks"; import type { ActionDto, TransactionDto } from "@stakekit/api-hooks"; import { @@ -15,11 +14,7 @@ import { type RefObject, useMemo, useState } from "react"; import { assign, emit, setup } from "xstate"; import { getAverageGasMode } from "../../../common/get-gas-mode-value"; import { withRequestErrorRetry } from "../../../common/utils"; -import { - getTransactionsForMultiSign, - isTxError, - transactionsForConstructOnlySet, -} from "../../../domain"; +import { isTxError } from "../../../domain"; import { useTrackEvent } from "../../../hooks/tracking/use-track-event"; import { useSKWallet } from "../../../providers/sk-wallet"; import type { GetStakeSessionError, SendTransactionError } from "./errors"; @@ -67,21 +62,10 @@ export const useStepsMachine = ({ transactions: ActionDto["transactions"]; integrationId: ActionDto["integrationId"]; }) => { - const { - signTransaction, - signMultipleTransactions, - signMessage, - connector, - isLedgerLive, - } = useSKWallet(); + const { signTransaction, signMessage, isLedgerLive } = useSKWallet(); const trackEvent = useTrackEvent(); - const multiSend = useMemo( - () => Maybe.fromNullable(connector).map(shouldMultiSend).orDefault(false), - [connector] - ); - const sortedTransactions = useMemo( () => transactions.sort((a, b) => a.stepIndex - b.stepIndex), [transactions] @@ -90,10 +74,8 @@ export const useStepsMachine = ({ const machineParams = useSavedRef({ transactions: sortedTransactions, integrationId, - multiSend, isLedgerLive, trackEvent, - signMultipleTransactions, signMessage, signTransaction, }); @@ -106,12 +88,8 @@ const getMachine = ( RefObject<{ transactions: ActionDto["transactions"]; integrationId: ActionDto["integrationId"]; - multiSend: boolean; isLedgerLive: boolean; trackEvent: ReturnType; - signMultipleTransactions: ReturnType< - typeof useSKWallet - >["signMultipleTransactions"]; signMessage: ReturnType["signMessage"]; signTransaction: ReturnType["signTransaction"]; }> @@ -126,8 +104,7 @@ const getMachine = ( const initContext = getInitContext( ref.current.transactions, - ref.current.integrationId, - ref.current.multiSend + ref.current.integrationId ); return setup({ @@ -241,80 +218,6 @@ const getMachine = ( .toEither(new Error("missing tx")) ) .chain((tx) => { - const txs = ref.current.transactions; - - /** - * Multi sign transactions - */ - if (ref.current.multiSend) { - return EitherAsync.liftEither( - Right( - txs.find((tx) => - transactionsForConstructOnlySet.has(tx.type) - ) - ) - ) - .chain((constructOnlyTx) => { - if (!constructOnlyTx) { - return EitherAsync.liftEither(Right(null)); - } - - return getAverageGasMode({ - network: constructOnlyTx.network, - }) - .chainLeft(async () => Right(null)) - .chain((gas) => - txConstruct(constructOnlyTx.id, { - gasArgs: gas?.gasArgs, - ledgerWalletAPICompatible: ref.current.isLedgerLive, - }).mapLeft(() => new TransactionConstructError()) - ) - .chain(() => - withRequestErrorRetry({ - fn: () => - transactionGetTransactionStatusFromId( - constructOnlyTx.id - ), - retryTimes: 10, - retryWaitForMs: () => 5000, - }).mapLeft( - () => - new Error( - `failed to get ${constructOnlyTx.id} tx status` - ) - ) - ); - }) - .map(() => getTransactionsForMultiSign(txs)) - .chain((txs) => - getAverageGasMode({ network: tx.network }).chain((gas) => - EitherAsync.sequence( - txs.map((tx) => - txConstruct(tx.id, { - gasArgs: gas?.gasArgs, - ledgerWalletAPICompatible: ref.current.isLedgerLive, - }).mapLeft(() => new TransactionConstructError()) - ) - ) - ) - ) - .map((txs) => - txs - .map((tx) => tx.unsignedTransaction) - .filter((tx) => tx !== null) - ) - .chain((txs) => { - if (!txs.length) { - return EitherAsync.liftEither( - Left(new TransactionConstructError()) - ); - } - - return ref.current.signMultipleTransactions({ txs }); - }) - .map((val) => ({ type: "regular", data: val })); - } - /** * Single sign transactions */ @@ -667,8 +570,7 @@ const getMachine = ( const getInitContext = ( transactions: ActionDto["transactions"], - integrationId: ActionDto["integrationId"], - shouldMultiSend: boolean + integrationId: ActionDto["integrationId"] ) => { if (!transactions.length) { return { @@ -700,7 +602,7 @@ const getInitContext = ( return { enabled: true, - txStates: shouldMultiSend ? [txStates[currentTxIdx]] : txStates, + txStates, currentTxMeta, yieldId: integrationId, }; diff --git a/packages/widget/src/providers/sk-wallet/index.tsx b/packages/widget/src/providers/sk-wallet/index.tsx index cc3bc39a..e58bc7c7 100644 --- a/packages/widget/src/providers/sk-wallet/index.tsx +++ b/packages/widget/src/providers/sk-wallet/index.tsx @@ -25,7 +25,7 @@ import type { SKWallet } from "../../domain/types"; import { useTrackEvent } from "../../hooks/tracking/use-track-event"; import { useIsomorphicEffect } from "../../hooks/use-isomorphic-effect"; import { - NotSupportedFlowError, + type NotSupportedFlowError, SendTransactionError, TransactionDecodeError, } from "../../pages/steps/hooks/errors"; @@ -260,66 +260,25 @@ export const SKWalletProvider = ({ children }: PropsWithChildren) => { } /** - * EVM connector + * Safe connector */ - return EitherAsync.liftEither( - Either.encase(() => JSON.parse(tx)) - .chain((val) => unsignedEVMTransactionCodec.decode(val)) - .mapLeft((e) => { - console.log(e); - return new TransactionDecodeError(); - }) - ).chain((val) => - EitherAsync(() => - /** - * Params need to be in strict format, don't spread the object(val)! - */ - sendTransactionAsync({ - data: val.data, - to: val.to, - value: val.value, - nonce: val.nonce, - maxFeePerGas: val.maxFeePerGas, - maxPriorityFeePerGas: val.maxPriorityFeePerGas, - chainId: val.chainId, - gas: val.gasLimit, - type: val.maxFeePerGas ? "eip1559" : "legacy", - }) - ) - .mapLeft(() => new SendTransactionError()) - .map((val) => ({ signedTx: val, broadcasted: true })) - ); - }), - [connectorDetails, cosmosCW, ledgerCurrentAccountId, sendTransactionAsync] - ); - - const signMultipleTransactions = useCallback< - SKWallet["signMultipleTransactions"] - >( - ({ txs }) => - connectorDetails.chain< - TransactionDecodeError | SendTransactionError | NotSupportedFlowError, - { signedTx: string; broadcasted: boolean } - >(({ conn, address }) => { if (isSafeConnector(conn)) { return EitherAsync.liftEither( - Either.sequence( - txs.map((tx) => - Either.encase(() => JSON.parse(tx)) - .chain((val) => unsignedEVMTransactionCodec.decode(val)) - .map((val) => prepareEVMTx({ address, decodedTx: val })) - .mapLeft(() => new TransactionDecodeError()) - ) - ) + Either.encase(() => JSON.parse(tx)) + .chain((val) => unsignedEVMTransactionCodec.decode(val)) + .map((val) => prepareEVMTx({ address, decodedTx: val })) + .mapLeft(() => new TransactionDecodeError()) ) .chain((val) => conn .sendTransactions({ - txs: val.map((v) => ({ - data: v.data, - to: v.to, - value: v.value ?? "0", - })), + txs: [ + { + data: val.data, + to: val.to, + value: val.value ?? "0", + }, + ], }) .map((res) => res.safeTxHash) ) @@ -361,9 +320,44 @@ export const SKWalletProvider = ({ children }: PropsWithChildren) => { .map((val) => ({ signedTx: val as Hash, broadcasted: true })); } - return EitherAsync.liftEither(Left(new NotSupportedFlowError())); + /** + * EVM connector + */ + return EitherAsync.liftEither( + Either.encase(() => JSON.parse(tx)) + .chain((val) => unsignedEVMTransactionCodec.decode(val)) + .mapLeft((e) => { + console.log(e); + return new TransactionDecodeError(); + }) + ).chain((val) => + EitherAsync(() => + /** + * Params need to be in strict format, don't spread the object(val)! + */ + sendTransactionAsync({ + data: val.data, + to: val.to, + value: val.value, + nonce: val.nonce, + maxFeePerGas: val.maxFeePerGas, + maxPriorityFeePerGas: val.maxPriorityFeePerGas, + chainId: val.chainId, + gas: val.gasLimit, + type: val.maxFeePerGas ? "eip1559" : "legacy", + }) + ) + .mapLeft(() => new SendTransactionError()) + .map((val) => ({ signedTx: val, broadcasted: true })) + ); }), - [connectorDetails, checkIsUnmounted] + [ + connectorDetails, + cosmosCW, + ledgerCurrentAccountId, + sendTransactionAsync, + checkIsUnmounted, + ] ); const signMessage = useCallback( @@ -400,7 +394,6 @@ export const SKWalletProvider = ({ children }: PropsWithChildren) => { const common = { disconnect, signTransaction, - signMultipleTransactions, signMessage, connectorChains, isLedgerLive, @@ -451,7 +444,6 @@ export const SKWalletProvider = ({ children }: PropsWithChildren) => { network, onLedgerAccountChange, signTransaction, - signMultipleTransactions, signMessage, ]);