diff --git a/.github/workflows/deploy-dockerhub.yml b/.github/workflows/deploy-dockerhub.yml
index 87719b0aae..db4c810127 100644
--- a/.github/workflows/deploy-dockerhub.yml
+++ b/.github/workflows/deploy-dockerhub.yml
@@ -13,7 +13,6 @@ on:
jobs:
dockerhub-push:
runs-on: ubuntu-latest
- if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' || startsWith(github.ref, 'refs/tags/')
steps:
- uses: actions/checkout@v3
- name: Dockerhub login
diff --git a/Dockerfile b/Dockerfile
index 9d34381fbf..c7005e98b4 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,10 @@
-FROM node:16-alpine
-RUN apk add --no-cache libc6-compat git python3 py3-pip make g++
+FROM node:18-alpine
+RUN apk add --no-cache libc6-compat git python3 py3-pip make g++ libusb-dev eudev-dev linux-headers
WORKDIR /app
COPY . .
# install deps
-RUN yarn install
+RUN yarn install --frozen-lockfile
ENV NODE_ENV production
diff --git a/cypress/e2e/smoke/address_book.cy.js b/cypress/e2e/smoke/address_book.cy.js
index 442c898316..3e365bd69a 100644
--- a/cypress/e2e/smoke/address_book.cy.js
+++ b/cypress/e2e/smoke/address_book.cy.js
@@ -4,8 +4,7 @@ import { format } from 'date-fns'
const NAME = 'Owner1'
const EDITED_NAME = 'Edited Owner1'
-const ENS_NAME = 'diogo.eth'
-const ENS_ADDRESS = '0x6a5602335a878ADDCa4BF63a050E34946B56B5bC'
+const ADDRESS = '0x6a5602335a878ADDCa4BF63a050E34946B56B5bC'
const GOERLI_TEST_SAFE = 'gor:0x97d314157727D517A706B5D08507A1f9B44AaaE9'
const GNO_TEST_SAFE = 'gno:0xB8d760a90a5ed54D3c2b3EFC231277e99188642A'
const GOERLI_CSV_ENTRY = {
@@ -30,13 +29,14 @@ describe('Address book', () => {
// Add a new entry manually
cy.contains('Create entry').click()
cy.get('input[name="name"]').type(NAME)
- cy.get('input[name="address"]').type(ENS_NAME)
- // Name was translated
- cy.get(ENS_NAME).should('not.exist')
+ cy.get('input[name="address"]').type(ADDRESS)
+
+ // Save the entry
cy.contains('button', 'Save').click()
+ // The new entry is visible
cy.contains(NAME).should('exist')
- cy.contains(ENS_ADDRESS).should('exist')
+ cy.contains(ADDRESS).should('exist')
})
it('should save an edited entry name', () => {
diff --git a/cypress/e2e/smoke/batch_tx.cy.js b/cypress/e2e/smoke/batch_tx.cy.js
index f1c626788d..579e8145ea 100644
--- a/cypress/e2e/smoke/batch_tx.cy.js
+++ b/cypress/e2e/smoke/batch_tx.cy.js
@@ -13,6 +13,8 @@ describe('Create batch transaction', () => {
before(() => {
cy.visit(`/home?safe=${SAFE}`)
cy.contains('Accept selection').click()
+
+ cy.contains(/E2E Wallet @ G(รถ|oe)rli/)
})
it('Should open an empty batch list', () => {
diff --git a/jest.setup.js b/jest.setup.js
index f4a9076f2f..8f8d57b6c7 100644
--- a/jest.setup.js
+++ b/jest.setup.js
@@ -12,7 +12,6 @@ jest.mock('@web3-onboard/keystone/dist/index', () => jest.fn())
jest.mock('@web3-onboard/ledger/dist/index', () => jest.fn())
jest.mock('@web3-onboard/trezor', () => jest.fn())
jest.mock('@web3-onboard/walletconnect', () => jest.fn())
-jest.mock('@web3-onboard/taho', () => jest.fn())
const mockOnboardState = {
chains: [],
diff --git a/package.json b/package.json
index 1c248236b8..eea885d6c4 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"homepage": "https://github.com/safe-global/safe-wallet-web",
"license": "GPL-3.0",
"type": "module",
- "version": "1.17.1",
+ "version": "1.18.0",
"scripts": {
"dev": "next dev",
"start": "next dev",
@@ -28,15 +28,15 @@
"serve": "npx -y serve out -p ${REVERSE_PROXY_UI_PORT:=8080}",
"static-serve": "yarn build && yarn serve"
},
+ "engines": {
+ "node": ">=16"
+ },
"pre-commit": [
"lint"
],
"resolutions": {
"@web3-onboard/trezor/**/protobufjs": "^7.2.4"
},
- "engines": {
- "node": ">=18"
- },
"dependencies": {
"@date-io/date-fns": "^2.15.0",
"@emotion/cache": "^11.10.1",
@@ -63,7 +63,6 @@
"@web3-onboard/injected-wallets": "^2.10.0",
"@web3-onboard/keystone": "^2.3.7",
"@web3-onboard/ledger": "2.3.2",
- "@web3-onboard/taho": "^2.0.5",
"@web3-onboard/trezor": "^2.4.2",
"@web3-onboard/walletconnect": "^2.4.5",
"classnames": "^2.3.1",
diff --git a/src/components/batch/BatchSidebar/index.tsx b/src/components/batch/BatchSidebar/index.tsx
index 65da6237e6..4edbbca106 100644
--- a/src/components/batch/BatchSidebar/index.tsx
+++ b/src/components/batch/BatchSidebar/index.tsx
@@ -10,6 +10,7 @@ import ConfirmBatchFlow from '@/components/tx-flow/flows/ConfirmBatch'
import Track from '@/components/common/Track'
import { BATCH_EVENTS } from '@/services/analytics'
import { BatchReorder } from './BatchTxList'
+import CheckWallet from '@/components/common/CheckWallet'
import PlusIcon from '@/public/images/common/plus.svg'
import EmptyBatch from './EmptyBatch'
@@ -27,6 +28,15 @@ const BatchSidebar = ({ isOpen, onToggle }: { isOpen: boolean; onToggle: (open:
batchTxs.forEach((item) => deleteTx(item.id))
}, [deleteTx, batchTxs])
+ // Close confirmation flow when batch is empty
+ const isConfirmationFlow = txFlow?.type === ConfirmBatchFlow
+ const shouldExitFlow = isConfirmationFlow && batchTxs.length === 0
+ useEffect(() => {
+ if (shouldExitFlow) {
+ setTxFlow(undefined)
+ }
+ }, [setTxFlow, shouldExitFlow])
+
const onAddClick = useCallback(
(e: SyntheticEvent) => {
e.preventDefault()
@@ -65,33 +75,45 @@ const BatchSidebar = ({ isOpen, onToggle }: { isOpen: boolean; onToggle: (open:
-
+
+ {(isOk) => (
+
+ )}
+
-
+
+ {(isOk) => (
+
+ )}
+
>
) : (
-
+
+ {(isOk) => (
+
+ )}
+
)}
diff --git a/src/components/licenses/index.tsx b/src/components/licenses/index.tsx
index 8061a5e5dd..fe6d496ebb 100644
--- a/src/components/licenses/index.tsx
+++ b/src/components/licenses/index.tsx
@@ -552,14 +552,6 @@ const SafeLicenses = () => {
-
- @web3-onboard/taho
-
-
- https://github.com/blocknative/web3-onboard/blob/main/LICENSE
-
-
-
@web3-onboard/trezor
diff --git a/src/components/transactions/TxDetails/TxData/index.tsx b/src/components/transactions/TxDetails/TxData/index.tsx
index 8b9faf0d70..81f46f50cc 100644
--- a/src/components/transactions/TxDetails/TxData/index.tsx
+++ b/src/components/transactions/TxDetails/TxData/index.tsx
@@ -7,7 +7,6 @@ import {
isMultisigDetailedExecutionInfo,
isSettingsChangeTxInfo,
isSpendingLimitMethod,
- isSupportedMultiSendAddress,
isSupportedSpendingLimitAddress,
isTransferTxInfo,
} from '@/utils/transaction-guards'
@@ -36,7 +35,7 @@ const TxData = ({ txDetails }: { txDetails: TransactionDetails }): ReactElement
return
}
- if (isSupportedMultiSendAddress(txInfo, chainId) && isMultiSendTxInfo(txInfo)) {
+ if (isMultiSendTxInfo(txInfo)) {
return
}
diff --git a/src/components/transactions/TxDetails/index.tsx b/src/components/transactions/TxDetails/index.tsx
index 8f57837278..5506754491 100644
--- a/src/components/transactions/TxDetails/index.tsx
+++ b/src/components/transactions/TxDetails/index.tsx
@@ -14,7 +14,6 @@ import {
isMultiSendTxInfo,
isMultisigDetailedExecutionInfo,
isMultisigExecutionInfo,
- isSupportedMultiSendAddress,
isTxQueued,
} from '@/utils/transaction-guards'
import { InfoDetails } from '@/components/transactions/InfoDetails'
@@ -39,7 +38,6 @@ type TxDetailsProps = {
}
const TxDetailsBlock = ({ txSummary, txDetails }: TxDetailsProps): ReactElement => {
- const chainId = useChainId()
const isPending = useIsPending(txSummary.id)
const isQueue = isTxQueued(txSummary.txStatus)
const awaitingExecution = isAwaitingExecution(txSummary.txStatus)
@@ -89,7 +87,7 @@ const TxDetailsBlock = ({ txSummary, txDetails }: TxDetailsProps): ReactElement
- {isSupportedMultiSendAddress(txDetails.txInfo, chainId) && isMultiSendTxInfo(txDetails.txInfo) && (
+ {isMultiSendTxInfo(txDetails.txInfo) && (
Error parsing data
}>
diff --git a/src/components/transactions/TxInfo/index.tsx b/src/components/transactions/TxInfo/index.tsx
index eb2be5d6dc..d0f51838bb 100644
--- a/src/components/transactions/TxInfo/index.tsx
+++ b/src/components/transactions/TxInfo/index.tsx
@@ -17,12 +17,10 @@ import {
isMultiSendTxInfo,
isNativeTokenTransfer,
isSettingsChangeTxInfo,
- isSupportedMultiSendAddress,
isTransferTxInfo,
} from '@/utils/transaction-guards'
import { ellipsis, shortenAddress } from '@/utils/formatters'
import { useCurrentChain } from '@/hooks/useChains'
-import useChainId from '@/hooks/useChainId'
export const TransferTx = ({
info,
@@ -98,13 +96,11 @@ const SettingsChangeTx = ({ info }: { info: SettingsChange }): ReactElement => {
}
const TxInfo = ({ info, ...rest }: { info: TransactionInfo; omitSign?: boolean; withLogo?: boolean }): ReactElement => {
- const chainId = useChainId()
-
if (isSettingsChangeTxInfo(info)) {
return
}
- if (isSupportedMultiSendAddress(info, chainId) && isMultiSendTxInfo(info)) {
+ if (isMultiSendTxInfo(info)) {
return
}
diff --git a/src/hooks/wallets/consts.ts b/src/hooks/wallets/consts.ts
index 8150309c3e..10a3bb99fa 100644
--- a/src/hooks/wallets/consts.ts
+++ b/src/hooks/wallets/consts.ts
@@ -1,23 +1,19 @@
export const enum WALLET_KEYS {
- COINBASE = 'COINBASE',
INJECTED = 'INJECTED',
- KEYSTONE = 'KEYSTONE',
- LEDGER = 'LEDGER',
+ WALLETCONNECT_V2 = 'WALLETCONNECT_V2',
+ COINBASE = 'COINBASE',
PAIRING = 'PAIRING',
+ LEDGER = 'LEDGER',
TREZOR = 'TREZOR',
- WALLETCONNECT = 'WALLETCONNECT',
- WALLETCONNECT_V2 = 'WALLETCONNECT_V2',
- TAHO = 'TAHO',
+ KEYSTONE = 'KEYSTONE',
}
export const CGW_NAMES: { [key in WALLET_KEYS]: string | undefined } = {
- [WALLET_KEYS.COINBASE]: 'coinbase',
[WALLET_KEYS.INJECTED]: 'detectedwallet',
- [WALLET_KEYS.KEYSTONE]: 'keystone',
- [WALLET_KEYS.LEDGER]: 'ledger',
+ [WALLET_KEYS.WALLETCONNECT_V2]: 'walletConnect_v2',
+ [WALLET_KEYS.COINBASE]: 'coinbase',
[WALLET_KEYS.PAIRING]: 'safeMobile',
+ [WALLET_KEYS.LEDGER]: 'ledger',
[WALLET_KEYS.TREZOR]: 'trezor',
- [WALLET_KEYS.WALLETCONNECT]: 'walletConnect',
- [WALLET_KEYS.WALLETCONNECT_V2]: 'walletConnect_v2',
- [WALLET_KEYS.TAHO]: 'tally',
+ [WALLET_KEYS.KEYSTONE]: 'keystone',
}
diff --git a/src/hooks/wallets/useOnboard.ts b/src/hooks/wallets/useOnboard.ts
index 5e38bb1ab1..2781d67d86 100644
--- a/src/hooks/wallets/useOnboard.ts
+++ b/src/hooks/wallets/useOnboard.ts
@@ -68,8 +68,7 @@ const getWalletConnectLabel = async (wallet: ConnectedWallet): Promise {
diff --git a/src/hooks/wallets/wallets.ts b/src/hooks/wallets/wallets.ts
index e85b7861f3..4a9e27aa38 100644
--- a/src/hooks/wallets/wallets.ts
+++ b/src/hooks/wallets/wallets.ts
@@ -1,5 +1,5 @@
-import { CYPRESS_MNEMONIC, TREZOR_APP_URL, TREZOR_EMAIL, WC_BRIDGE, WC_PROJECT_ID } from '@/config/constants'
-import type { RecommendedInjectedWallets, WalletInit, WalletModule } from '@web3-onboard/common/dist/types.d'
+import { CYPRESS_MNEMONIC, TREZOR_APP_URL, TREZOR_EMAIL, WC_PROJECT_ID } from '@/config/constants'
+import type { RecommendedInjectedWallets, WalletInit } from '@web3-onboard/common/dist/types.d'
import type { ChainInfo } from '@safe-global/safe-gateway-typescript-sdk'
import coinbaseModule from '@web3-onboard/coinbase'
@@ -8,7 +8,6 @@ import keystoneModule from '@web3-onboard/keystone/dist/index'
import ledgerModule from '@web3-onboard/ledger/dist/index'
import trezorModule from '@web3-onboard/trezor'
import walletConnect from '@web3-onboard/walletconnect'
-import tahoModule from '@web3-onboard/taho'
import pairingModule from '@/services/pairing/module'
import e2eWalletModule from '@/tests/e2e-wallet'
@@ -18,20 +17,6 @@ const prefersDarkMode = (): boolean => {
return window?.matchMedia('(prefers-color-scheme: dark)')?.matches
}
-// We need to modify the module name as onboard dedupes modules with the same label and the WC v1 and v2 modules have the same
-// @see https://github.com/blocknative/web3-onboard/blob/d399e0b76daf7b363d6a74b100b2c96ccb14536c/packages/core/src/store/actions.ts#L419
-// TODO: When removing this, also remove the associated CSS in `onboard.css`
-export const WALLET_CONNECT_V1_MODULE_NAME = 'WalletConnect v1'
-const walletConnectV1 = (): WalletInit => {
- return (helpers) => {
- const walletConnectModule = walletConnect({ version: 1, bridge: WC_BRIDGE })(helpers) as WalletModule
-
- walletConnectModule.label = WALLET_CONNECT_V1_MODULE_NAME
-
- return walletConnectModule
- }
-}
-
const walletConnectV2 = (chain: ChainInfo): WalletInit => {
// WalletConnect v2 requires a project ID
if (!WC_PROJECT_ID) {
@@ -54,14 +39,12 @@ const walletConnectV2 = (chain: ChainInfo): WalletInit => {
const WALLET_MODULES: { [key in WALLET_KEYS]: (chain: ChainInfo) => WalletInit } = {
[WALLET_KEYS.INJECTED]: () => injectedWalletModule(),
- [WALLET_KEYS.PAIRING]: () => pairingModule(),
- [WALLET_KEYS.WALLETCONNECT]: () => walletConnectV1(),
[WALLET_KEYS.WALLETCONNECT_V2]: (chain) => walletConnectV2(chain),
+ [WALLET_KEYS.COINBASE]: () => coinbaseModule({ darkMode: prefersDarkMode() }),
+ [WALLET_KEYS.PAIRING]: () => pairingModule(),
[WALLET_KEYS.LEDGER]: () => ledgerModule(),
[WALLET_KEYS.TREZOR]: () => trezorModule({ appUrl: TREZOR_APP_URL, email: TREZOR_EMAIL }),
[WALLET_KEYS.KEYSTONE]: () => keystoneModule(),
- [WALLET_KEYS.TAHO]: () => tahoModule(),
- [WALLET_KEYS.COINBASE]: () => coinbaseModule({ darkMode: prefersDarkMode() }),
}
export const getAllWallets = (chain: ChainInfo): WalletInit[] => {
diff --git a/src/services/contracts/safeContracts.ts b/src/services/contracts/safeContracts.ts
index a3ef2c4ffb..922584745d 100644
--- a/src/services/contracts/safeContracts.ts
+++ b/src/services/contracts/safeContracts.ts
@@ -1,7 +1,6 @@
import {
getFallbackHandlerDeployment,
getMultiSendCallOnlyDeployment,
- getMultiSendDeployment,
getProxyFactoryDeployment,
getSafeL2SingletonDeployment,
getSafeSingletonDeployment,
@@ -102,28 +101,6 @@ export const getReadOnlyGnosisSafeContract = (chain: ChainInfo, safeVersion: str
// MultiSend
-const getMultiSendContractDeployment = (chainId: string) => {
- return getMultiSendDeployment({ network: chainId }) || getMultiSendDeployment()
-}
-
-export const getMultiSendContractAddress = (chainId: string): string | undefined => {
- const deployment = getMultiSendContractDeployment(chainId)
-
- return deployment?.networkAddresses[chainId]
-}
-
-// MultiSendCallOnly
-
-const getMultiSendCallOnlyContractDeployment = (chainId: string) => {
- return getMultiSendCallOnlyDeployment({ network: chainId }) || getMultiSendCallOnlyDeployment()
-}
-
-export const getMultiSendCallOnlyContractAddress = (chainId: string): string | undefined => {
- const deployment = getMultiSendCallOnlyContractDeployment(chainId)
-
- return deployment?.networkAddresses[chainId]
-}
-
export const getMultiSendCallOnlyContract = (
chainId: string,
safeVersion: SafeInfo['version'] = LATEST_SAFE_VERSION,
@@ -132,7 +109,7 @@ export const getMultiSendCallOnlyContract = (
const ethAdapter = createEthersAdapter(provider)
return ethAdapter.getMultiSendCallOnlyContract({
- singletonDeployment: getMultiSendCallOnlyContractDeployment(chainId),
+ singletonDeployment: getMultiSendCallOnlyDeployment({ network: chainId, version: safeVersion || undefined }),
..._getValidatedGetContractProps(chainId, safeVersion),
})
}
@@ -144,7 +121,7 @@ export const getReadOnlyMultiSendCallOnlyContract = (
const ethAdapter = createReadOnlyEthersAdapter()
return ethAdapter.getMultiSendCallOnlyContract({
- singletonDeployment: getMultiSendCallOnlyContractDeployment(chainId),
+ singletonDeployment: getMultiSendCallOnlyDeployment({ network: chainId, version: safeVersion || undefined }),
..._getValidatedGetContractProps(chainId, safeVersion),
})
}
diff --git a/src/store/batchSlice.ts b/src/store/batchSlice.ts
index fc93d682f6..31897e623a 100644
--- a/src/store/batchSlice.ts
+++ b/src/store/batchSlice.ts
@@ -74,7 +74,7 @@ export const batchSlice = createSlice({
export const { setBatch, addTx, removeTx } = batchSlice.actions
const selectAllBatches = (state: RootState): BatchTxsState => {
- return state[batchSlice.name] || {}
+ return state[batchSlice.name] || initialState
}
export const selectBatchBySafe = createSelector(
diff --git a/src/store/settingsSlice.ts b/src/store/settingsSlice.ts
index 691e8d96f3..d31b752622 100644
--- a/src/store/settingsSlice.ts
+++ b/src/store/settingsSlice.ts
@@ -151,9 +151,12 @@ export const selectTokenList = (state: RootState): SettingsState['tokenList'] =>
return state[settingsSlice.name].tokenList || initialState.tokenList
}
-export const selectHiddenTokensPerChain = (state: RootState, chainId: string): string[] => {
- return state[settingsSlice.name].hiddenTokens?.[chainId] || []
-}
+export const selectHiddenTokensPerChain = createSelector(
+ [selectSettings, (_, chainId) => chainId],
+ (settings, chainId) => {
+ return settings.hiddenTokens?.[chainId] || []
+ },
+)
export const selectRpc = createSelector(selectSettings, (settings) => settings.env.rpc)
diff --git a/src/utils/__tests__/transactions.test.ts b/src/utils/__tests__/transactions.test.ts
index 6d73f5dc38..52c47123ac 100644
--- a/src/utils/__tests__/transactions.test.ts
+++ b/src/utils/__tests__/transactions.test.ts
@@ -5,6 +5,8 @@ import type {
SafeAppData,
Transaction,
} from '@safe-global/safe-gateway-typescript-sdk'
+import { TransactionInfoType } from '@safe-global/safe-gateway-typescript-sdk'
+import { isMultiSendTxInfo } from '../transaction-guards'
import { getQueuedTransactionCount, getTxOrigin } from '../transactions'
describe('transactions', () => {
@@ -110,4 +112,77 @@ describe('transactions', () => {
)
})
})
+
+ describe('isMultiSendTxInfo', () => {
+ it('should return true for a multisend tx', () => {
+ expect(
+ isMultiSendTxInfo({
+ type: TransactionInfoType.CUSTOM,
+ to: {
+ value: '0x40A2aCCbd92BCA938b02010E17A5b8929b49130D',
+ name: 'Gnosis Safe: MultiSendCallOnly',
+ logoUri:
+ 'https://safe-transaction-assets.safe.global/contracts/logos/0x40A2aCCbd92BCA938b02010E17A5b8929b49130D.png',
+ },
+ dataSize: '1188',
+ value: '0',
+ methodName: 'multiSend',
+ actionCount: 3,
+ isCancellation: false,
+ }),
+ ).toBe(true)
+ })
+
+ it('should return false for non-multisend txs', () => {
+ expect(
+ isMultiSendTxInfo({
+ type: TransactionInfoType.CUSTOM,
+ to: {
+ value: '0x40A2aCCbd92BCA938b02010E17A5b8929b49130D',
+ name: 'Gnosis Safe: MultiSendCallOnly',
+ logoUri:
+ 'https://safe-transaction-assets.safe.global/contracts/logos/0x40A2aCCbd92BCA938b02010E17A5b8929b49130D.png',
+ },
+ dataSize: '1188',
+ value: '0',
+ methodName: 'multiSend',
+ //actionCount: 3, // missing actionCount
+ isCancellation: false,
+ }),
+ ).toBe(false)
+
+ expect(
+ isMultiSendTxInfo({
+ type: TransactionInfoType.CUSTOM,
+ to: {
+ value: '0x40A2aCCbd92BCA938b02010E17A5b8929b49130D',
+ name: 'Gnosis Safe: MultiSendCallOnly',
+ logoUri:
+ 'https://safe-transaction-assets.safe.global/contracts/logos/0x40A2aCCbd92BCA938b02010E17A5b8929b49130D.png',
+ },
+ dataSize: '1188',
+ value: '0',
+ methodName: 'notMultiSend', // wrong method
+ actionCount: 3,
+ isCancellation: false,
+ }),
+ ).toBe(false)
+
+ expect(
+ isMultiSendTxInfo({
+ type: TransactionInfoType.SETTINGS_CHANGE, // wrong type
+ dataDecoded: {
+ method: 'changeThreshold',
+ parameters: [
+ {
+ name: '_threshold',
+ type: 'uint256',
+ value: '2',
+ },
+ ],
+ },
+ }),
+ ).toBe(false)
+ })
+ })
})
diff --git a/src/utils/transaction-guards.ts b/src/utils/transaction-guards.ts
index 5622cc1b81..a8f402a8b6 100644
--- a/src/utils/transaction-guards.ts
+++ b/src/utils/transaction-guards.ts
@@ -35,7 +35,6 @@ import {
} from '@safe-global/safe-gateway-typescript-sdk'
import { getSpendingLimitModuleAddress } from '@/services/contracts/spendingLimitContracts'
import { sameAddress } from '@/utils/addresses'
-import { getMultiSendCallOnlyContractAddress, getMultiSendContractAddress } from '@/services/contracts/safeContracts'
import type { NamedAddress } from '@/components/new-safe/create/types'
export const isTxQueued = (value: TransactionStatus): boolean => {
@@ -78,16 +77,12 @@ export const isCustomTxInfo = (value: TransactionInfo): value is Custom => {
return value.type === TransactionInfoType.CUSTOM
}
-export const isSupportedMultiSendAddress = (txInfo: TransactionInfo, chainId: string): boolean => {
- const toAddress = isCustomTxInfo(txInfo) ? txInfo.to.value : ''
- const multiSendAddress = getMultiSendContractAddress(chainId)
- const multiSendCallOnlyAddress = getMultiSendCallOnlyContractAddress(chainId)
-
- return sameAddress(multiSendAddress, toAddress) || sameAddress(multiSendCallOnlyAddress, toAddress)
-}
-
export const isMultiSendTxInfo = (value: TransactionInfo): value is MultiSend => {
- return value.type === TransactionInfoType.CUSTOM && value.methodName === 'multiSend'
+ return (
+ value.type === TransactionInfoType.CUSTOM &&
+ value.methodName === 'multiSend' &&
+ typeof value.actionCount === 'number'
+ )
}
export const isCancellationTxInfo = (value: TransactionInfo): value is Cancellation => {
diff --git a/yarn.lock b/yarn.lock
index eceda5cd86..22db38c51a 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -5040,15 +5040,6 @@
buffer "^6.0.3"
ethereumjs-util "^7.1.3"
-"@web3-onboard/taho@^2.0.5":
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/@web3-onboard/taho/-/taho-2.0.5.tgz#899d147c234d61e1fb81045fc7339182c230c632"
- integrity sha512-Z5n2UMumLNppOlDgYM9MhrM+YGyz8Emouaf7htH8l4B2r/meV4F3Wkgol2xYuwwu5SJyPaJH2GxNeh/EAfyBxg==
- dependencies:
- "@web3-onboard/common" "^2.3.3"
- tallyho-detect-provider "^1.0.0"
- tallyho-onboarding "^1.0.2"
-
"@web3-onboard/trezor@^2.4.2":
version "2.4.2"
resolved "https://registry.yarnpkg.com/@web3-onboard/trezor/-/trezor-2.4.2.tgz#49a485467d970ae872288c07eccb7adf18782622"
@@ -5860,7 +5851,7 @@ borsh@^0.7.0:
bs58 "^4.0.0"
text-encoding-utf-8 "^1.0.2"
-bowser@^2.11.0, bowser@^2.9.0:
+bowser@^2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f"
integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==
@@ -13410,18 +13401,6 @@ table-layout@^1.0.2:
typical "^5.2.0"
wordwrapjs "^4.0.0"
-tallyho-detect-provider@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/tallyho-detect-provider/-/tallyho-detect-provider-1.0.2.tgz#6e462c34494217d39a83e22709dd855488b2d32d"
- integrity sha512-VUGZiWUrKJUUjtnkib09tuNO7Kld4UWLs54nnNYP0tewvzmeb1VWDK0UTv88bEUcuRKx2YWGDIuOuK9v270Ewg==
-
-tallyho-onboarding@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/tallyho-onboarding/-/tallyho-onboarding-1.0.2.tgz#afc7dc4eb05b3a7861ead215e798585e1cbe2e91"
- integrity sha512-bdFT/fNrFrq1BYVgjl/JKtwDmeS+z2u0415PoxmGmmYYRfdcKqXtEPImMoEbVwGtOeN0iFVohuS8ESrrAe+w7w==
- dependencies:
- bowser "^2.9.0"
-
tapable@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"