From 98a11e7f9d41442db9c2ced08430813afce85572 Mon Sep 17 00:00:00 2001 From: Leandro Date: Tue, 9 Jan 2024 04:04:28 -0800 Subject: [PATCH 1/2] fix(limit): show price impact warning for Safe App when bundling (#3571) --- .../limitOrders/containers/LimitOrdersWarnings/index.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/cowswap-frontend/src/modules/limitOrders/containers/LimitOrdersWarnings/index.tsx b/apps/cowswap-frontend/src/modules/limitOrders/containers/LimitOrdersWarnings/index.tsx index 3b66f62476..e1a89bdd35 100644 --- a/apps/cowswap-frontend/src/modules/limitOrders/containers/LimitOrdersWarnings/index.tsx +++ b/apps/cowswap-frontend/src/modules/limitOrders/containers/LimitOrdersWarnings/index.tsx @@ -73,7 +73,9 @@ export function LimitOrdersWarnings(props: LimitOrdersWarningsProps) { const tradeQuote = useTradeQuote() const priceImpactParams = useTradePriceImpact() - const canTrade = localFormValidation === null && primaryFormValidation === null && !tradeQuote.error + const isBundling = primaryFormValidation && FORM_STATES_TO_SHOW_BUNDLE_BANNER.includes(primaryFormValidation) + + const canTrade = localFormValidation === null && (primaryFormValidation === null || isBundling) && !tradeQuote.error const showPriceImpactWarning = canTrade && !expertMode && !!account && !priceImpactParams.loading && !priceImpactParams.priceImpact @@ -84,8 +86,7 @@ export function LimitOrdersWarnings(props: LimitOrdersWarningsProps) { const showHighFeeWarning = feePercentage?.greaterThan(HIGH_FEE_WARNING_PERCENTAGE) - const showApprovalBundlingBanner = - !isConfirmScreen && primaryFormValidation && FORM_STATES_TO_SHOW_BUNDLE_BANNER.includes(primaryFormValidation) + const showApprovalBundlingBanner = !isConfirmScreen && isBundling const shouldZeroApprove = useShouldZeroApprove(slippageAdjustedSellAmount) const showZeroApprovalWarning = shouldZeroApprove && outputCurrency !== null // Show warning only when output currency is also present. From 93d9cba3f1f2bff8960de79ede04f0b03a69d1bc Mon Sep 17 00:00:00 2001 From: Leandro Date: Tue, 9 Jan 2024 04:16:28 -0800 Subject: [PATCH 2/2] feat(safe): rely on safeInfo and iframe detection to identify when loaded as SafeApp (#3570) --- .../src/web3-react/hooks/useWalletMetadata.ts | 31 +++++++------------ libs/wallet/src/web3-react/updater.ts | 7 ++--- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/libs/wallet/src/web3-react/hooks/useWalletMetadata.ts b/libs/wallet/src/web3-react/hooks/useWalletMetadata.ts index a806047654..1055059c6c 100644 --- a/libs/wallet/src/web3-react/hooks/useWalletMetadata.ts +++ b/libs/wallet/src/web3-react/hooks/useWalletMetadata.ts @@ -6,21 +6,9 @@ import { default as AlphaImage } from '../../api/assets/alpha.svg' import { ConnectionType } from '../../api/types' import { getIsAlphaWallet } from '../../api/utils/connection' import { getWeb3ReactConnection } from '../utils/getWeb3ReactConnection' +import { useGnosisSafeInfo } from '../../api/hooks' -const WC_DESKTOP_GNOSIS_SAFE_APP_NAME = 'WalletConnect Safe App' -const WC_MOBILE_GNOSIS_SAFE_APP_NAME = 'Safe' const SAFE_APP_NAME = 'Safe App' -const GNOSIS_SAFE_APP_NAME = 'Gnosis Safe App' -const SAFE_WALLET_NAME = 'Safe{Wallet}' -const SAFE_WALLET_IOS = 'Safe (iOS)' -const GNOSIS_APP_NAMES = [ - SAFE_APP_NAME, - GNOSIS_SAFE_APP_NAME, - WC_DESKTOP_GNOSIS_SAFE_APP_NAME, - WC_MOBILE_GNOSIS_SAFE_APP_NAME, - SAFE_WALLET_NAME, - SAFE_WALLET_IOS, -] const SAFE_ICON_URL = 'https://app.safe.global/favicon.ico' @@ -88,6 +76,7 @@ export function useWalletMetaData(): WalletMetaData { } if (connectionType === ConnectionType.GNOSIS_SAFE) { + // TODO: potentially here is where we'll need to work to show the multiple flavours of Safe wallets return METADATA_SAFE } @@ -100,9 +89,15 @@ export function useWalletMetaData(): WalletMetaData { * It'll be false if connected to Safe wallet via WalletConnect */ export function useIsSafeApp(): boolean { - const { walletName } = useWalletMetaData() + const isSafeWallet = useIsSafeWallet() + + if (!isSafeWallet) { + return false + } - return walletName === SAFE_APP_NAME + // Will only be a SafeApp if within an iframe + // Which means, window.parent is different than window + return window?.parent !== window } /** @@ -110,11 +105,7 @@ export function useIsSafeApp(): boolean { * regardless of the connection method (WalletConnect or inside Safe as an App) */ export function useIsSafeWallet(): boolean { - const { walletName } = useWalletMetaData() - - if (!walletName) return false - - return GNOSIS_APP_NAMES.includes(walletName.trim()) + return !!useGnosisSafeInfo() } /** diff --git a/libs/wallet/src/web3-react/updater.ts b/libs/wallet/src/web3-react/updater.ts index dbfc009891..d0916b8f38 100644 --- a/libs/wallet/src/web3-react/updater.ts +++ b/libs/wallet/src/web3-react/updater.ts @@ -7,7 +7,7 @@ import { getSafeInfo } from '@cowprotocol/core' import { getCurrentChainIdFromUrl } from '@cowprotocol/common-utils' import { useSafeAppsSdkInfo } from './hooks/useSafeAppsSdkInfo' -import { useIsSafeWallet, useWalletMetaData } from './hooks/useWalletMetadata' +import { useWalletMetaData } from './hooks/useWalletMetadata' import { gnosisSafeInfoAtom, walletDetailsAtom, walletInfoAtom } from '../api/state' import { GnosisSafeInfo, WalletDetails, WalletInfo } from '../api/types' @@ -61,12 +61,11 @@ function _useWalletDetails(account?: string): WalletDetails { function _useSafeInfo(walletInfo: WalletInfo): GnosisSafeInfo | undefined { const { provider } = useWeb3React() const { account, chainId } = walletInfo - const isSafeConnected = useIsSafeWallet() const [safeInfo, setSafeInfo] = useState() const { isReadOnly } = useSafeAppsSdkInfo() || {} useEffect(() => { - if (chainId && account && isSafeConnected && provider) { + if (chainId && account && provider) { getSafeInfo(chainId, account, provider) .then((_safeInfo) => setSafeInfo({ @@ -80,7 +79,7 @@ function _useSafeInfo(walletInfo: WalletInfo): GnosisSafeInfo | undefined { } else { setSafeInfo(undefined) } - }, [setSafeInfo, chainId, account, isSafeConnected, provider, isReadOnly]) + }, [setSafeInfo, chainId, account, provider, isReadOnly]) return safeInfo }