From d9c3a311e901901161ce239f9cfeae9a1df6c487 Mon Sep 17 00:00:00 2001 From: Peter Sanderson Date: Mon, 8 Jul 2024 10:48:32 +0200 Subject: [PATCH] feat(suite): remove RBF option from the SendForm, make all Transactions with RBF enabled by default --- packages/suite-analytics/src/types/events.ts | 1 - .../suite/src/actions/wallet/stakeActions.ts | 1 - .../TransactionReviewOutputList.tsx | 1 - .../TransactionReviewSummary.tsx | 55 +++++++------------ .../wallet/useCoinmarketExchangeOffers.ts | 2 +- packages/suite/src/hooks/wallet/useRbfForm.ts | 2 +- .../suite/src/hooks/wallet/useSendForm.ts | 4 +- .../src/hooks/wallet/useSendFormFields.ts | 8 --- .../Options/BitcoinOptions/BitcoinOptions.tsx | 31 ----------- .../Options/BitcoinOptions/Locktime.tsx | 55 +------------------ suite-common/suite-config/src/features.ts | 1 - suite-common/wallet-constants/src/sendForm.ts | 9 ++- .../src/send/sendFormBitcoinThunks.ts | 29 ++++++---- .../wallet-core/src/send/sendFormThunks.ts | 2 - .../src/transactions/transactionsThunks.ts | 3 +- suite-common/wallet-types/src/sendForm.ts | 1 - suite-common/wallet-types/src/transaction.ts | 1 - suite-common/wallet-utils/package.json | 1 - .../wallet-utils/src/sendFormUtils.ts | 8 +-- suite-common/wallet-utils/tsconfig.json | 1 - yarn.lock | 1 - 21 files changed, 54 insertions(+), 163 deletions(-) diff --git a/packages/suite-analytics/src/types/events.ts b/packages/suite-analytics/src/types/events.ts index 565ae987fe6..fd0d2f0a6b3 100644 --- a/packages/suite-analytics/src/types/events.ts +++ b/packages/suite-analytics/src/types/events.ts @@ -188,7 +188,6 @@ export type SuiteAnalyticsEvent = tokens: string; outputsCount: number; broadcast: boolean; - bitcoinRbf: boolean; bitcoinLockTime: boolean; ethereumData: boolean; ethereumNonce: boolean; diff --git a/packages/suite/src/actions/wallet/stakeActions.ts b/packages/suite/src/actions/wallet/stakeActions.ts index 5aa0427ad3d..492b0d65013 100644 --- a/packages/suite/src/actions/wallet/stakeActions.ts +++ b/packages/suite/src/actions/wallet/stakeActions.ts @@ -151,7 +151,6 @@ export const signTransaction = const enhancedTxInfo: PrecomposedTransactionFinal = { ...transactionInfo, - rbf: false, }; // store formValues and transactionInfo in send reducer to be used by TransactionReviewModal diff --git a/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewOutputList/TransactionReviewOutputList.tsx b/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewOutputList/TransactionReviewOutputList.tsx index bacfc50ca7d..4c3721631cb 100644 --- a/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewOutputList/TransactionReviewOutputList.tsx +++ b/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewOutputList/TransactionReviewOutputList.tsx @@ -141,7 +141,6 @@ export const TransactionReviewOutputList = ({ .join(','), outputsCount: precomposedForm.outputs.length, broadcast: broadcastEnabled, - bitcoinRbf: !!options.includes('bitcoinRBF'), bitcoinLockTime: !!options.includes('bitcoinLockTime'), ethereumData: !!options.includes('ethereumData'), rippleDestinationTag: !!options.includes('rippleDestinationTag'), diff --git a/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewSummary.tsx b/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewSummary.tsx index f24049f01ed..1baff9541e1 100644 --- a/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewSummary.tsx +++ b/packages/suite/src/components/suite/modals/ReduxModal/TransactionReviewModal/TransactionReviewSummary.tsx @@ -2,7 +2,7 @@ import styled, { useTheme } from 'styled-components'; import { BigNumber } from '@trezor/utils/src/bigNumber'; import { getFeeUnits, formatNetworkAmount, formatAmount, getFee } from '@suite-common/wallet-utils'; import { Icon, CoinLogo, variables } from '@trezor/components'; -import { formatDuration, isFeatureFlagEnabled } from '@suite-common/suite-utils'; +import { formatDuration } from '@suite-common/suite-utils'; import { borders, spacingsPx, typography } from '@trezor/theme'; import { TranslationKey } from '@suite-common/intl-types'; import { Translation, FormattedCryptoAmount, AccountLabel } from 'src/components/suite'; @@ -164,7 +164,7 @@ const LeftDetailsBottom = styled.div` flex: 1; `; -const ReviewRbfLeftDetailsLineLeft = styled.div` +const ReviewLeftDetailsLineLeft = styled.div` display: flex; align-items: center; margin: 0 5% 0 0; @@ -177,7 +177,7 @@ const ReviewRbfLeftDetailsLineLeft = styled.div` } `; -const ReviewRbfLeftDetailsLineRight = styled.div<{ $color: string; $uppercase?: boolean }>` +const ReviewLeftDetailsLineRight = styled.div<{ $color: string; $uppercase?: boolean }>` width: 45%; text-align: left; color: ${props => props.$color}; @@ -268,40 +268,40 @@ export const TransactionReviewSummary = ({ {estimateTime !== undefined && ( - + - + - + {formatDuration(estimateTime)} - + )} {!!tx.feeLimit && network.networkType !== 'solana' && ( - + - + - + {tx.feeLimit} - + )} - + {network.networkType === 'bitcoin' && } {network.networkType === 'ethereum' && } {network.networkType === 'ripple' && } {network.networkType === 'solana' && } - + - + {fee} {getFeeUnits(network.networkType)} - + {isComposedFeeRateDifferent && network.networkType === 'bitcoin' && ( @@ -313,35 +313,18 @@ export const TransactionReviewSummary = ({ )} - + - + - - + - {isFeatureFlagEnabled('RBF') && - network.features?.includes('rbf') && - network.networkType !== 'ethereum' && ( - - - - - - - - - - - )} {tx.inputs.length !== 0 && ( diff --git a/packages/suite/src/hooks/wallet/useCoinmarketExchangeOffers.ts b/packages/suite/src/hooks/wallet/useCoinmarketExchangeOffers.ts index c674994e783..e2ebb432179 100644 --- a/packages/suite/src/hooks/wallet/useCoinmarketExchangeOffers.ts +++ b/packages/suite/src/hooks/wallet/useCoinmarketExchangeOffers.ts @@ -303,7 +303,7 @@ export const useOffers = ({ selectedAccount }: UseCoinmarketExchangeFormProps) = undefined, undefined, undefined, - ['broadcast', 'bitcoinRBF'], + ['broadcast'], ); // in case of not success, recomposeAndSign shows notification if (result?.success) { diff --git a/packages/suite/src/hooks/wallet/useRbfForm.ts b/packages/suite/src/hooks/wallet/useRbfForm.ts index 76d194a144e..e62648d9065 100644 --- a/packages/suite/src/hooks/wallet/useRbfForm.ts +++ b/packages/suite/src/hooks/wallet/useRbfForm.ts @@ -166,7 +166,7 @@ const useRbfState = ({ selectedAccount, rbfParams, chainedTxs }: UseRbfProps) => outputs, selectedFee: undefined, setMaxOutputId, - options: ['bitcoinRBF', 'broadcast'], + options: ['broadcast'], ethereumDataHex: rbfParams.ethereumData, rbfParams, baseFee, diff --git a/packages/suite/src/hooks/wallet/useSendForm.ts b/packages/suite/src/hooks/wallet/useSendForm.ts index f01055bd1f4..b9289c22351 100644 --- a/packages/suite/src/hooks/wallet/useSendForm.ts +++ b/packages/suite/src/hooks/wallet/useSendForm.ts @@ -138,12 +138,12 @@ export const useSendForm = (props: UseSendFormProps): SendContextValues => { } return { - ...getDefaultValues(localCurrencyOption, state.network), + ...getDefaultValues(localCurrencyOption), ...loadedState, ...feeEnhancement, }; }, - [dispatch, localCurrencyOption, state.network], + [dispatch, localCurrencyOption], ); // update custom values diff --git a/packages/suite/src/hooks/wallet/useSendFormFields.ts b/packages/suite/src/hooks/wallet/useSendFormFields.ts index 8e0f1c8a816..423e26ef7e8 100644 --- a/packages/suite/src/hooks/wallet/useSendFormFields.ts +++ b/packages/suite/src/hooks/wallet/useSendFormFields.ts @@ -2,7 +2,6 @@ import { useCallback } from 'react'; import { FieldPath, UseFormReturn } from 'react-hook-form'; import { formatNetworkAmount, toFiatCurrency } from '@suite-common/wallet-utils'; import { FormState, FormOptions } from '@suite-common/wallet-types'; -import { isFeatureFlagEnabled } from '@suite-common/suite-utils'; import { useBitcoinAmountUnit } from './useBitcoinAmountUnit'; import { Rate } from '@suite-common/wallet-types'; import { SendContextValues, UseSendFormState } from 'src/types/wallet/sendForm'; @@ -113,13 +112,6 @@ export const useSendFormFields = ({ }; const toggleOption = (option: FormOptions) => { - if ( - option === 'bitcoinRBF' && - (!isFeatureFlagEnabled('RBF') || !network.features?.includes('rbf')) - ) { - // do not use RBF if disabled - return; - } const enabledOptions = getValues('options') || []; const isEnabled = enabledOptions.includes(option); if (isEnabled) { diff --git a/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/BitcoinOptions.tsx b/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/BitcoinOptions.tsx index c38992277c3..2bf2a8daf59 100644 --- a/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/BitcoinOptions.tsx +++ b/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/BitcoinOptions.tsx @@ -1,7 +1,6 @@ import { useWatch } from 'react-hook-form'; import styled from 'styled-components'; -import { isFeatureFlagEnabled } from '@suite-common/suite-utils'; import { Button, Tooltip, variables } from '@trezor/components'; import { spacingsPx } from '@trezor/theme'; import { Translation } from 'src/components/suite'; @@ -55,7 +54,6 @@ const Inline = styled.span` export const BitcoinOptions = () => { const { - network, addOutput, control, utxoSelection: { isCoinControlEnabled }, @@ -74,7 +72,6 @@ export const BitcoinOptions = () => { }); const locktimeEnabled = options.includes('bitcoinLockTime'); - const rbfEnabled = options.includes('bitcoinRBF'); const utxoSelectionEnabled = options.includes('utxoSelection'); const broadcastEnabled = options.includes('broadcast'); @@ -115,33 +112,6 @@ export const BitcoinOptions = () => { )} - - {isFeatureFlagEnabled('RBF') && - network.features?.includes('rbf') && - !locktimeEnabled && ( - - } - content={} - cursor="pointer" - > - { - toggleOption('bitcoinRBF'); - composeTransaction(); - }} - > - - - - - - - )} } cursor="pointer"> { close={() => { resetDefaultValue('bitcoinLockTime'); // close additional form - if (!rbfEnabled) toggleOption('bitcoinRBF'); if (!broadcastEnabled) toggleOption('broadcast'); toggleOption('bitcoinLockTime'); composeTransaction(); diff --git a/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/Locktime.tsx b/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/Locktime.tsx index 89275bda086..2e15d158b95 100644 --- a/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/Locktime.tsx +++ b/packages/suite/src/views/wallet/send/components/Options/BitcoinOptions/Locktime.tsx @@ -2,49 +2,25 @@ import { BigNumber } from '@trezor/utils/src/bigNumber'; import styled from 'styled-components'; import { NumberInput, Translation } from 'src/components/suite'; import { useSendFormContext } from 'src/hooks/wallet'; -import { Card, Icon, IconButton, Paragraph, Switch } from '@trezor/components'; +import { Card, Icon, IconButton } from '@trezor/components'; import { getInputState, isInteger } from '@suite-common/wallet-utils'; -import { isFeatureFlagEnabled } from '@suite-common/suite-utils'; import { useTranslation } from 'src/hooks/suite'; import { spacingsPx } from '@trezor/theme'; -const RbfIcon = styled(Icon)` - padding-top: ${spacingsPx.xs}; -`; - const Label = styled.div` display: flex; align-items: center; gap: ${spacingsPx.xs}; `; -const RbfMessage = styled.div` - display: flex; - flex: 1; - margin-top: ${spacingsPx.xs}; - gap: ${spacingsPx.xs}; -`; - -const Center = styled.div` - display: flex; - flex: 1; - flex-direction: column; -`; - -const Description = styled(Paragraph)` - color: ${({ theme }) => theme.textSubdued}; -`; - interface LocktimeProps { close: () => void; } export const Locktime = ({ close }: LocktimeProps) => { const { - network, control, getDefaultValue, - setValue, toggleOption, formState: { errors }, composeTransaction, @@ -53,7 +29,6 @@ export const Locktime = ({ close }: LocktimeProps) => { const { translationString } = useTranslation(); const options = getDefaultValue('options', []); - const rbfEnabled = options.includes('bitcoinRBF'); const broadcastEnabled = options.includes('broadcast'); const inputName = 'bitcoinLockTime'; const inputValue = getDefaultValue(inputName) || ''; @@ -61,7 +36,6 @@ export const Locktime = ({ close }: LocktimeProps) => { const handleLocktimeChange = () => { if (!error) { - if (rbfEnabled) toggleOption('bitcoinRBF'); if (broadcastEnabled) toggleOption('broadcast'); } composeTransaction(inputName); @@ -85,15 +59,6 @@ export const Locktime = ({ close }: LocktimeProps) => { }, }; - const handleRbfSwitch = () => { - if (inputValue.length > 0) { - setValue(inputName, ''); - } - - toggleOption('bitcoinRBF'); - composeTransaction(inputName); - }; - return ( { bottomText={error?.message || null} data-test="locktime-input" /> - - {isFeatureFlagEnabled('RBF') && network.features?.includes('rbf') && ( - - - -
- - - - - - - -
- - -
- )}
); }; diff --git a/suite-common/suite-config/src/features.ts b/suite-common/suite-config/src/features.ts index f1b73d343fc..9e3cfd0a9d9 100644 --- a/suite-common/suite-config/src/features.ts +++ b/suite-common/suite-config/src/features.ts @@ -6,7 +6,6 @@ // General flags export const FLAGS = { GOOGLE_DRIVE_SYNC: true, // Google Drive sync (used for labeling) - RBF: true, // replace by fee feature in the send form FILE_SYSTEM_SYNC: false, // File system sync (used for labeling) ONION_LOCATION_META: true, // Show TOR onion-location meta tag in page head DESKTOP_AUTO_UPDATER: true, // Runs auto updater code on desktop diff --git a/suite-common/wallet-constants/src/sendForm.ts b/suite-common/wallet-constants/src/sendForm.ts index d51835608a3..4c1f5f66361 100644 --- a/suite-common/wallet-constants/src/sendForm.ts +++ b/suite-common/wallet-constants/src/sendForm.ts @@ -1,8 +1,15 @@ export const CUSTOM_FEE = 'custom' as const; export const FIRST_OUTPUT_ID = 0; + +// A popular choice is to use 0xFFFFFFFD for your sequence fields, +// as this enables both the locktime field (in case you want to use it) +// and also replace-by-fee (which is generally useful). +export const BTC_RBF_SEQUENCE = 0xffffffff - 2; + +// Locktime enabled, but RBF disabled export const BTC_LOCKTIME_SEQUENCE = 0xffffffff - 1; + export const BTC_LOCKTIME_VALUE = 500000000; // if locktime is equal/greater than this then it's a timestamp -export const BTC_RBF_SEQUENCE = 0xffffffff - 2; export const XRP_FLAG = 0x80000000; export const U_INT_32 = 0xffffffff; export const ETH_BACKUP_GAS_LIMIT = '21000'; diff --git a/suite-common/wallet-core/src/send/sendFormBitcoinThunks.ts b/suite-common/wallet-core/src/send/sendFormBitcoinThunks.ts index 48edca90d7a..3ca08e73525 100644 --- a/suite-common/wallet-core/src/send/sendFormBitcoinThunks.ts +++ b/suite-common/wallet-core/src/send/sendFormBitcoinThunks.ts @@ -10,9 +10,11 @@ import { restoreOrigOutputsOrder, getUtxoOutpoint, } from '@suite-common/wallet-utils'; -import { BTC_RBF_SEQUENCE, BTC_LOCKTIME_SEQUENCE } from '@suite-common/wallet-constants'; +import { BTC_LOCKTIME_SEQUENCE, BTC_RBF_SEQUENCE } from '@suite-common/wallet-constants'; import { + Account, AddressDisplayOptions, + FormState, PrecomposedLevels, PrecomposedTransaction, } from '@suite-common/wallet-types'; @@ -23,6 +25,20 @@ import { selectDevice } from '../device/deviceReducer'; import { ComposeTransactionThunkArguments, SignTransactionThunkArguments } from './sendFormTypes'; import { SEND_MODULE_PREFIX } from './sendFormConstants'; +type GetSequenceParams = { account: Account; formValues: FormState }; + +const getSequence = ({ account, formValues }: GetSequenceParams) => { + if (hasNetworkFeatures(account, 'rbf')) { + return BTC_RBF_SEQUENCE; + } + + if (formValues.bitcoinLockTime) { + return BTC_LOCKTIME_SEQUENCE; + } + + return undefined; // Must be undefined for final (non-RBF) transaction with no locktime +}; + export const composeBitcoinSendFormTransactionThunk = createThunk( `${SEND_MODULE_PREFIX}/composeBitcoinSendFormTransactionThunk`, async ( @@ -58,14 +74,7 @@ export const composeBitcoinSendFormTransactionThunk = createThunk( }); } - let sequence; // Must be undefined for final transaction. - if (formValues.options.includes('bitcoinRBF')) { - // RBF is set, add sequence to inputs - sequence = BTC_RBF_SEQUENCE; - } else if (formValues.bitcoinLockTime) { - // locktime is set, add sequence to inputs - sequence = BTC_LOCKTIME_SEQUENCE; - } + const sequence = getSequence({ account, formValues }); // exclude unspendable utxos if coin control is not enabled // unspendable utxos are defined in `useSendForm` hook @@ -83,7 +92,7 @@ export const composeBitcoinSendFormTransactionThunk = createThunk( ? account.addresses.change.filter(a => !prison[a.address]) : account.addresses.change; - const params = { + const params: Parameters[0] = { account: { path: account.path, addresses: { diff --git a/suite-common/wallet-core/src/send/sendFormThunks.ts b/suite-common/wallet-core/src/send/sendFormThunks.ts index 0c1cad0e379..7183831ff60 100644 --- a/suite-common/wallet-core/src/send/sendFormThunks.ts +++ b/suite-common/wallet-core/src/send/sendFormThunks.ts @@ -471,8 +471,6 @@ export const enhancePrecomposedTransactionThunk = createThunk< }; if (!isCardanoTx(selectedAccount, enhancedPrecomposedTransaction)) { - enhancedPrecomposedTransaction.rbf = formValues.options.includes('bitcoinRBF'); - if (formValues.rbfParams) { enhancedPrecomposedTransaction.prevTxid = formValues.rbfParams.txid; enhancedPrecomposedTransaction.feeDifference = new BigNumber( diff --git a/suite-common/wallet-core/src/transactions/transactionsThunks.ts b/suite-common/wallet-core/src/transactions/transactionsThunks.ts index aceda138028..6debea27718 100644 --- a/suite-common/wallet-core/src/transactions/transactionsThunks.ts +++ b/suite-common/wallet-core/src/transactions/transactionsThunks.ts @@ -80,7 +80,6 @@ export const replaceTransactionThunk = createThunk( ...origTx.tx, txid: newTxid, fee: precomposedTransaction.fee, - rbf: !!precomposedTransaction.rbf, blockTime: Math.round(new Date().getTime() / 1000), // TODO: details: {}, is it worth it? }; @@ -89,7 +88,7 @@ export const replaceTransactionThunk = createThunk( newTx.ethereumSpecific = replaceEthereumSpecific(newTx, precomposedTransaction); // finalized and recv tx shouldn't have rbfParams - if (!precomposedTransaction.rbf || origTx.tx.type === 'recv') { + if (origTx.tx.type === 'recv') { delete newTx.rbfParams; } else { // update tx rbfParams diff --git a/suite-common/wallet-types/src/sendForm.ts b/suite-common/wallet-types/src/sendForm.ts index 62aafb4bea4..59a98e5b9d7 100644 --- a/suite-common/wallet-types/src/sendForm.ts +++ b/suite-common/wallet-types/src/sendForm.ts @@ -5,7 +5,6 @@ import { Output, RbfTransactionParams } from './transaction'; export type FormOptions = | 'broadcast' | 'utxoSelection' - | 'bitcoinRBF' | 'bitcoinLockTime' | 'ethereumData' | 'ethereumNonce' // TODO diff --git a/suite-common/wallet-types/src/transaction.ts b/suite-common/wallet-types/src/transaction.ts index 6212c59d493..29321c41d3e 100644 --- a/suite-common/wallet-types/src/transaction.ts +++ b/suite-common/wallet-types/src/transaction.ts @@ -104,7 +104,6 @@ type TxFinal = PrecomposedTransactionConnectResponseFinal & { feeLimit?: string; estimatedFeeLimit?: string; token?: TokenInfo; - rbf?: boolean; }; // base of PrecomposedTransactionFinal diff --git a/suite-common/wallet-utils/package.json b/suite-common/wallet-utils/package.json index 2a18ebcf5a8..358d5a81988 100644 --- a/suite-common/wallet-utils/package.json +++ b/suite-common/wallet-utils/package.json @@ -20,7 +20,6 @@ "@suite-common/metadata-types": "workspace:*", "@suite-common/suite-config": "workspace:*", "@suite-common/suite-types": "workspace:*", - "@suite-common/suite-utils": "workspace:*", "@suite-common/test-utils": "workspace:*", "@suite-common/token-definitions": "workspace:*", "@suite-common/wallet-config": "workspace:*", diff --git a/suite-common/wallet-utils/src/sendFormUtils.ts b/suite-common/wallet-utils/src/sendFormUtils.ts index 845786a9808..1c6afb3d516 100644 --- a/suite-common/wallet-utils/src/sendFormUtils.ts +++ b/suite-common/wallet-utils/src/sendFormUtils.ts @@ -11,7 +11,6 @@ import { fromWei, numberToHex, padLeft, toWei } from 'web3-utils'; import { BigNumber } from '@trezor/utils/src/bigNumber'; import { fiatCurrencies } from '@suite-common/suite-config'; -import { isFeatureFlagEnabled } from '@suite-common/suite-utils'; import { Network, NetworkType } from '@suite-common/wallet-config'; import { EthereumTransaction, TokenInfo, ComposeOutput, PROTO } from '@trezor/connect'; import { @@ -404,12 +403,9 @@ export const restoreOrigOutputsOrder = ( }); }; -export const getDefaultValues = (currency: Output['currency'], network: Network): FormState => ({ +export const getDefaultValues = (currency: Output['currency']): FormState => ({ ...DEFAULT_VALUES, - options: - isFeatureFlagEnabled('RBF') && network.features?.includes('rbf') - ? ['bitcoinRBF', 'broadcast'] - : ['broadcast'], + options: ['broadcast'], outputs: [{ ...DEFAULT_PAYMENT, currency }], selectedUtxos: [], }); diff --git a/suite-common/wallet-utils/tsconfig.json b/suite-common/wallet-utils/tsconfig.json index 7acf3bc5892..16ee22051aa 100644 --- a/suite-common/wallet-utils/tsconfig.json +++ b/suite-common/wallet-utils/tsconfig.json @@ -7,7 +7,6 @@ { "path": "../metadata-types" }, { "path": "../suite-config" }, { "path": "../suite-types" }, - { "path": "../suite-utils" }, { "path": "../test-utils" }, { "path": "../token-definitions" }, { "path": "../wallet-config" }, diff --git a/yarn.lock b/yarn.lock index 42cea568b25..7d1eea22323 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8917,7 +8917,6 @@ __metadata: "@suite-common/metadata-types": "workspace:*" "@suite-common/suite-config": "workspace:*" "@suite-common/suite-types": "workspace:*" - "@suite-common/suite-utils": "workspace:*" "@suite-common/test-utils": "workspace:*" "@suite-common/token-definitions": "workspace:*" "@suite-common/wallet-config": "workspace:*"