diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1b024dd7..725ddbcb2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## [1.50.1](https://github.com/cowprotocol/cowswap/compare/v1.50.0...v1.50.1) (2023-11-27) + + +### Bug Fixes + +* adds NEW! tag to MORE menu item ([#3448](https://github.com/cowprotocol/cowswap/issues/3448)) ([f6a4358](https://github.com/cowprotocol/cowswap/commit/f6a435847bd872f4e9464ee2eaffced8ea17b755)) + +## [1.50.0](https://github.com/cowprotocol/cowswap/compare/v1.49.6...v1.50.0) (2023-11-24) + + +### Features + +* refactor snippets ([#3409](https://github.com/cowprotocol/cowswap/issues/3409)) ([1b703ea](https://github.com/cowprotocol/cowswap/commit/1b703ea2aa1735a19be9b90d403b9e952e9a4310)) +* widget skeleton ([#3393](https://github.com/cowprotocol/cowswap/issues/3393)) ([af1add9](https://github.com/cowprotocol/cowswap/commit/af1add99627abf7787e6957724fdec67c4cebf9a)) +* **widget:** embed icons ([#3389](https://github.com/cowprotocol/cowswap/issues/3389)) ([c07a25f](https://github.com/cowprotocol/cowswap/commit/c07a25f5ba1b9bbbdf90ba5d0406d03d4dda9043)) + + +### Bug Fixes + +* do not send permit to quote when enough allowance ([#3433](https://github.com/cowprotocol/cowswap/issues/3433)) ([58b6ade](https://github.com/cowprotocol/cowswap/commit/58b6ade450537d7bb304947697e7b3e47b34408e)) +* **widget-configurator:** set default trade pair USDC/COW ([#3420](https://github.com/cowprotocol/cowswap/issues/3420)) ([86743fe](https://github.com/cowprotocol/cowswap/commit/86743fe2d51b851d1830fe9b14e7e4b640a36114)) + ## [1.49.6](https://github.com/cowprotocol/cowswap/compare/v1.49.5...v1.49.6) (2023-11-16) diff --git a/apps/cowswap-frontend/src/legacy/components/Header/styled.tsx b/apps/cowswap-frontend/src/legacy/components/Header/styled.tsx index 782ee7f9cf..1a72770073 100644 --- a/apps/cowswap-frontend/src/legacy/components/Header/styled.tsx +++ b/apps/cowswap-frontend/src/legacy/components/Header/styled.tsx @@ -336,6 +336,12 @@ export const HeaderLinks = styled(HeaderLinksMod)<{ isMobileMenuOpen: boolean }> height: 10px; } `}; + + ${({ theme }) => theme.mediaWidth.upToSmall` + > button > svg { + order: 3; + } + `}; } ${MenuContent} { diff --git a/apps/cowswap-frontend/src/legacy/components/MenuDropdown/index.tsx b/apps/cowswap-frontend/src/legacy/components/MenuDropdown/index.tsx index 0d6f5372d3..2109c6f349 100644 --- a/apps/cowswap-frontend/src/legacy/components/MenuDropdown/index.tsx +++ b/apps/cowswap-frontend/src/legacy/components/MenuDropdown/index.tsx @@ -7,14 +7,17 @@ import SVG from 'react-inlinesvg' import { useMediaQuery, LargeAndUp } from 'legacy/hooks/useMediaQuery' +import { MenuBadge } from 'modules/mainMenu/pure/MenuTree/styled' + import { MenuFlyout, Content } from './styled' interface MenuProps { title: string + badge?: string children: React.ReactNode } -export function Menu({ title, children }: MenuProps) { +export function Menu({ title, badge, children }: MenuProps) { const isLargeAndUp = useMediaQuery(LargeAndUp) const node = useRef() const [showMenu, setShowMenu] = useState(false) @@ -29,6 +32,7 @@ export function Menu({ title, children }: MenuProps) { {showMenu && {children}} diff --git a/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts b/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts index d0a7060837..eccc2a11a5 100644 --- a/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts +++ b/apps/cowswap-frontend/src/modules/appData/updater/AppDataHooksUpdater.ts @@ -1,25 +1,67 @@ -import { useEffect, useRef } from 'react' +import { useEffect, useMemo, useRef } from 'react' + +import { PermitHookData } from '@cowprotocol/permit-utils' import { useAccountAgnosticPermitHookData } from 'modules/permit' +import { useDerivedSwapInfo } from 'modules/swap/hooks/useSwapState' +import { useLimitHasEnoughAllowance } from '../../limitOrders/hooks/useTradeFlowContext' +import { useSwapEnoughAllowance } from '../../swap/hooks/useSwapFlowContext' import { useUpdateAppDataHooks } from '../hooks' import { buildAppDataHooks } from '../utils/buildAppDataHooks' +// const count = 0 + +function usePermitDataIfNotAllowance(): PermitHookData | undefined { + const permitHookData = useAccountAgnosticPermitHookData() || {} + + // Remove permitData if the user has enough allowance for the current trade + const swapHasEnoughAllowance = useSwapEnoughAllowance() + const limitHasEnoughAllowance = useLimitHasEnoughAllowance() + const shouldUsePermit = swapHasEnoughAllowance === false || limitHasEnoughAllowance === false + + const { target, callData, gasLimit }: Partial = permitHookData || {} + + return useMemo(() => { + if (!target || !callData || !gasLimit) { + return undefined + } + + return shouldUsePermit ? { target, callData, gasLimit } : undefined + }, [shouldUsePermit, target, callData, gasLimit]) +} + export function AppDataHooksUpdater(): null { + const { v2Trade } = useDerivedSwapInfo() const updateAppDataHooks = useUpdateAppDataHooks() - const permitHookData = useAccountAgnosticPermitHookData() - - // To avoid dumb re-renders - const ref = useRef(permitHookData) - ref.current = permitHookData - const stableRef = JSON.stringify(permitHookData) + const permitData = usePermitDataIfNotAllowance() + const permitDataPrev = useRef(undefined) + const hasTradeInfo = !!v2Trade useEffect(() => { - if (stableRef) { - const hooks = buildAppDataHooks(ref.current ? [ref.current] : undefined) + if ( + !hasTradeInfo || // If there's no trade info, wait until we have one to update the hooks (i.e. missing quote) + JSON.stringify(permitDataPrev.current) === JSON.stringify(permitData) // Or if the permit data has not changed + ) { + return undefined + } + + const hooks = buildAppDataHooks({ + preInteractionHooks: permitData ? [permitData] : undefined, + }) + + if (hooks) { + // Update the hooks + console.log('[AppDataHooksUpdater]: Set hooks', hooks) updateAppDataHooks(hooks) + permitDataPrev.current = permitData + } else { + // There was a hook data, but not any more. The hook needs to be removed + console.log('[AppDataHooksUpdater] Clear hooks') + updateAppDataHooks(undefined) + permitDataPrev.current = undefined } - }, [stableRef, updateAppDataHooks]) + }, [updateAppDataHooks, permitData, hasTradeInfo]) return null } diff --git a/apps/cowswap-frontend/src/modules/appData/utils/buildAppDataHooks.ts b/apps/cowswap-frontend/src/modules/appData/utils/buildAppDataHooks.ts index a03512a3ae..b42dae9adc 100644 --- a/apps/cowswap-frontend/src/modules/appData/utils/buildAppDataHooks.ts +++ b/apps/cowswap-frontend/src/modules/appData/utils/buildAppDataHooks.ts @@ -1,9 +1,12 @@ import { AppDataHooks, PostHooks, PreHooks } from '../types' -export function buildAppDataHooks( - preInteractionHooks?: PreHooks, +export function buildAppDataHooks({ + preInteractionHooks, + postInteractionHooks, +}: { + preInteractionHooks?: PreHooks postInteractionHooks?: PostHooks -): AppDataHooks | undefined { +}): AppDataHooks | undefined { if (!preInteractionHooks && !postInteractionHooks) { return undefined } diff --git a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.cosmos.tsx b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.cosmos.tsx index 49bebe0ed4..eb32a77dde 100644 --- a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.cosmos.tsx +++ b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.cosmos.tsx @@ -1,10 +1,12 @@ +import { BadgeType } from '@cowprotocol/ui' + import { Widget } from 'modules/application/pure/Widget' -import { TradeWidgetLinks, BadgeType } from '.'; +import { TradeWidgetLinks } from '.' type BadgeInfo = { - text: string; - type: BadgeType; + text: string + type: BadgeType } const BADGES: BadgeInfo[] = [ @@ -13,24 +15,21 @@ const BADGES: BadgeInfo[] = [ { text: 'ALPHA', type: 'alert' }, { text: 'NEW!', type: 'alert2' }, { text: 'RELEASE', type: 'information' }, -]; +] type Fixtures = { - [key: string]: React.FunctionComponent; -}; + [key: string]: React.FunctionComponent +} const BadgeFixtures = BADGES.reduce((fixtures, badge) => { const Fixture = () => ( - + - ); + ) - fixtures[`Badge - ${badge.text} (${badge.type})`] = Fixture; - return fixtures; -}, {}); + fixtures[`Badge - ${badge.text} (${badge.type})`] = Fixture + return fixtures +}, {}) -export default BadgeFixtures; +export default BadgeFixtures diff --git a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.tsx b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.tsx index 21d347d12a..c599d4367d 100644 --- a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.tsx +++ b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/index.tsx @@ -1,5 +1,6 @@ import { useState } from 'react' +import { BadgeType } from '@cowprotocol/ui' import type { TradeType } from '@cowprotocol/widget-lib' import { Trans } from '@lingui/macro' @@ -26,17 +27,10 @@ interface MenuItemConfig { badgeType?: BadgeType } -export type BadgeType = 'information' | 'success' | 'alert' | 'alert2' | 'default' - const MENU_ITEMS: MenuItemConfig[] = [ { route: Routes.SWAP, label: 'Swap' }, { route: Routes.LIMIT_ORDER, label: 'Limit' }, - { - route: Routes.ADVANCED_ORDERS, - label: 'TWAP', - badgeText: 'NEW!', - badgeType: 'alert2', - }, + { route: Routes.ADVANCED_ORDERS, label: 'TWAP' }, ] const TRADE_TYPE_TO_ROUTE: Record = { diff --git a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/styled.ts b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/styled.ts index c800690ed5..78babef566 100644 --- a/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/styled.ts +++ b/apps/cowswap-frontend/src/modules/application/containers/TradeWidgetLinks/styled.ts @@ -1,10 +1,10 @@ +import { BadgeType } from '@cowprotocol/ui' + import { NavLink } from 'react-router-dom' import styled, { css } from 'styled-components/macro' import { UI } from 'common/constants/theme' -import { BadgeType } from '.' - const badgeBackgrounds: Record = { information: `var(${UI.COLOR_INFORMATION_BG})`, alert: `var(${UI.COLOR_ALERT_BG})`, diff --git a/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts b/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts index 244a10c9ab..a85aa5f09a 100644 --- a/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts +++ b/apps/cowswap-frontend/src/modules/limitOrders/hooks/useTradeFlowContext.ts @@ -22,6 +22,19 @@ import { useTradeQuote } from 'modules/tradeQuote' import { useLimitOrdersDerivedState } from './useLimitOrdersDerivedState' +export function useLimitHasEnoughAllowance(): boolean | undefined { + const state = useLimitOrdersDerivedState() + const { chainId, account } = useWalletInfo() + + const checkAllowanceAddress = GP_VAULT_RELAYER[chainId] + const { enoughAllowance } = useEnoughBalanceAndAllowance({ + account, + amount: state.slippageAdjustedSellAmount || undefined, + checkAllowanceAddress, + }) + return enoughAllowance +} + export function useTradeFlowContext(): TradeFlowContext | null { const { provider } = useWeb3React() const { chainId, account } = useWalletInfo() diff --git a/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts b/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts index 7b59c53fd3..f71190c0b0 100644 --- a/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts +++ b/apps/cowswap-frontend/src/modules/limitOrders/services/tradeFlow/index.ts @@ -1,7 +1,9 @@ import { OrderClass } from '@cowprotocol/cow-sdk' -import { isSupportedPermitInfo } from '@cowprotocol/permit-utils' +import { PERMIT_SIGNER, isSupportedPermitInfo } from '@cowprotocol/permit-utils' import { Percent } from '@uniswap/sdk-core' +import * as Sentry from '@sentry/browser' + import { PriceImpact } from 'legacy/hooks/usePriceImpact' import { partialOrderUpdate } from 'legacy/state/orders/utils' import { signAndPostOrder } from 'legacy/utils/trade' @@ -68,6 +70,14 @@ export async function tradeFlow( generatePermitHook, }) + if (postOrderParams.appData.fullAppData.includes(PERMIT_SIGNER.address)) { + // report this to sentry if we ever use the default signer in the permit + Sentry.captureException('User signed the permit using PERMIT_SIGNER instead of their account', { + tags: { errorType: 'permitWithDefaultSigner' }, + contexts: { params: { account } }, + }) + } + logTradeFlow('LIMIT ORDER FLOW', 'STEP 3: send transaction') tradeFlowAnalytics.trade(swapFlowAnalyticsContext) diff --git a/apps/cowswap-frontend/src/modules/mainMenu/constants/mainMenu.tsx b/apps/cowswap-frontend/src/modules/mainMenu/constants/mainMenu.tsx index ee2b62c335..7543139ef6 100644 --- a/apps/cowswap-frontend/src/modules/mainMenu/constants/mainMenu.tsx +++ b/apps/cowswap-frontend/src/modules/mainMenu/constants/mainMenu.tsx @@ -98,6 +98,7 @@ export const MAIN_MENU: MenuTreeItem[] = [ { kind: MenuItemKind.DROP_DOWN, title: 'More', + badge: 'New!', items: [ { sectionTitle: 'Overview', diff --git a/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/index.tsx b/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/index.tsx index f9706a0914..0abb26afa6 100644 --- a/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/index.tsx +++ b/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/index.tsx @@ -127,10 +127,10 @@ interface DropdownProps { } const DropDown = ({ item, context }: DropdownProps) => { - const { title, items } = item + const { title, items, badge } = item return ( - + {items?.map((item, index) => { const { sectionTitle, links } = item return ( diff --git a/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/styled.ts b/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/styled.ts index bb5af729cf..6347ac2706 100644 --- a/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/styled.ts +++ b/apps/cowswap-frontend/src/modules/mainMenu/pure/MenuTree/styled.ts @@ -5,8 +5,8 @@ import { UI } from 'common/constants/theme' export const MenuBadge = styled.div` display: flex; align-items: center; - padding: 0 5px; - margin-left: 5px; + padding: 3px 5px; + margin: 0 0 0 5px; background: var(${UI.COLOR_ALERT2_BG}); color: var(${UI.COLOR_ALERT2_TEXT}); border: 0; diff --git a/apps/cowswap-frontend/src/modules/mainMenu/types.ts b/apps/cowswap-frontend/src/modules/mainMenu/types.ts index 90708b7610..701219a838 100644 --- a/apps/cowswap-frontend/src/modules/mainMenu/types.ts +++ b/apps/cowswap-frontend/src/modules/mainMenu/types.ts @@ -76,6 +76,7 @@ export interface DropDownItem { kind: MenuItemKind.DROP_DOWN title: string items: DropDownSubItem[] + badge?: string } export type MenuTreeItem = InternalLink | ExternalLink | DropDownItem | ParametrizedLink | CustomItem diff --git a/apps/cowswap-frontend/src/modules/permit/permit-state.drawio.svg b/apps/cowswap-frontend/src/modules/permit/permit-state.drawio.svg new file mode 100644 index 0000000000..2940e2efca --- /dev/null +++ b/apps/cowswap-frontend/src/modules/permit/permit-state.drawio.svg @@ -0,0 +1,489 @@ + + + + + + + + + +
+
+
+
+ + + ordersPermitStatusAtom + + +
+
+
+
+
+
+ + ordersPermitStatusAtom + +
+
+ + + + +
+
+
+ + Map<string, boolean | undefined> +
+
+
+
+ + + Map<string, boolean | undefined> + +
+
+ + + + + + +
+
+
+
+
+ staticPermitCacheAtom +
+
+
+
+
+
+ + staticPermitCacheAtom + +
+
+ + + + +
+
+
+ + Map<string, string> +
+
+
+
+ + + Map<string, string> + +
+
+ + + + + + +
+
+
+
+
+ userPermitCacheAtom +
+
+
+
+
+
+ + userPermitCacheAtom + +
+
+ + + + +
+
+
+ + Map<string, string> +
+
+
+
+ + + Map<string, string> + +
+
+ + + + + + +
+
+
+
+
+
+ + getPermitCacheAtom + +
+
+
+
+
+
+
+ + getPermitCacheAtom + +
+
+ + + + +
+
+
+ + Map<string, string> +
+
+
+
+ + + Map<string, string> + +
+
+ + + + + + +
+
+
+
+
+
+
+ + permittableTokensAtom + +
+
+
+
+
+
+
+
+ + permittableTokensAtom + +
+
+ + + + +
+
+
+ + - + + Map< + + + SupportedChainId, + + + Record + + + < + + + string + + + , + + + PermitInfo + + + > + + +
+
+
+ +
+
+
+
+
+
+ + - Map<SupportedChainId, Record<string, PermitInfo> + +
+
+ + + + + + +
+
+
+
+
+
+
+ + PermitInfo + +
+
+
+
+
+
+
+
+ + PermitInfo + +
+
+ + + + +
+
+
+ - + + chainId + + + : + + + + + SupportedChainId +
+
+
+
+
+
+
+ + - chainId: SupportedChainId... + +
+
+ + + + +
+
+
+ - + + tokenAddress + + + : + + + + + string + +
+
+
+
+ + - tokenAddress: string + +
+
+ + + + +
+
+
+ - + + permitInfo + + + : + + + + + PermitInfo + +
+
+
+
+ + - permitInfo: PermitInfo + +
+
+ + + + +
+
+
+ - + + chainId + + + : + + + + + SupportedChainId +
+
+
+
+
+
+
+ + - chainId: SupportedChainId... + +
+
+ + + + + + + + + + +
+
+
+ + Keeps track of open orders permit, in case they become invalid (i.e. nonce is bumped) + +
+
+
+
+ + Keeps track of open orders permit, in case th... + +
+
+ + + + +
+
+
+ + Permit cache for user signed permits + +
+
+
+
+ + Permit cache for user signed permits + +
+
+ + + + +
+
+
+ + Permit cache for MOCK account signed permits +
+ (relevant for getting the quote) +
+
+
+
+
+
+ + Permit cache for MOCK account signed permits... + +
+
+ + + + +
+
+
+ + Keeps track of the tokens that are permitable +
+
+
+
+
+
+ + Keeps track of the tokens that are permitable + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/apps/cowswap-frontend/src/modules/permit/utils/handlePermit.ts b/apps/cowswap-frontend/src/modules/permit/utils/handlePermit.ts index be16388c94..f200596b43 100644 --- a/apps/cowswap-frontend/src/modules/permit/utils/handlePermit.ts +++ b/apps/cowswap-frontend/src/modules/permit/utils/handlePermit.ts @@ -30,7 +30,9 @@ export async function handlePermit(params: HandlePermitParams): Promise | undefined, + CurrencyAmount | undefined +] { + const { v2Trade: trade, allowedSlippage } = useDerivedSwapInfo() + + const { INPUT, OUTPUT } = computeSlippageAdjustedAmounts(trade, allowedSlippage) + + return [INPUT, OUTPUT] +} + export function useBaseFlowContextSetup(): BaseFlowContextSetup { const { provider } = useWeb3React() const { account, chainId } = useWalletInfo() const { allowsOffchainSigning } = useWalletDetails() const gnosisSafeInfo = useGnosisSafeInfo() const { recipient } = useSwapState() - const { v2Trade: trade, allowedSlippage } = useDerivedSwapInfo() + const { v2Trade: trade } = useDerivedSwapInfo() const appData = useAppData() const closeModals = useCloseModals() @@ -104,10 +115,7 @@ export function useBaseFlowContextSetup(): BaseFlowContextSetup { const isEoaEthFlow = useIsEoaEthFlow() const isSafeEthFlow = useIsSafeEthFlow() - const { INPUT: inputAmountWithSlippage, OUTPUT: outputAmountWithSlippage } = computeSlippageAdjustedAmounts( - trade, - allowedSlippage - ) + const [inputAmountWithSlippage, outputAmountWithSlippage] = useSwapAmountsWithSlippage() const sellTokenContract = useTokenContract(getAddress(inputAmountWithSlippage?.currency) || undefined, true) const isSafeBundle = useIsSafeApprovalBundle(inputAmountWithSlippage) diff --git a/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts b/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts index c341019305..bcd6267a46 100644 --- a/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts +++ b/apps/cowswap-frontend/src/modules/swap/hooks/useSwapFlowContext.ts @@ -2,10 +2,16 @@ import { GP_VAULT_RELAYER } from '@cowprotocol/common-const' import { useGP2SettlementContract } from '@cowprotocol/common-hooks' import { getWrappedToken } from '@cowprotocol/common-utils' import { OrderKind, SupportedChainId } from '@cowprotocol/cow-sdk' +import { useWalletInfo } from '@cowprotocol/wallet' import { TradeType as UniTradeType } from '@uniswap/sdk-core' import { useGeneratePermitHook, usePermitInfo } from 'modules/permit' -import { FlowType, getFlowContext, useBaseFlowContextSetup } from 'modules/swap/hooks/useFlowContext' +import { + FlowType, + getFlowContext, + useBaseFlowContextSetup, + useSwapAmountsWithSlippage, +} from 'modules/swap/hooks/useFlowContext' import { SwapFlowContext } from 'modules/swap/services/types' import { useEnoughBalanceAndAllowance } from 'modules/tokens' import { TradeType } from 'modules/trade' @@ -41,3 +47,17 @@ export function useSwapFlowContext(): SwapFlowContext | null { generatePermitHook, } } + +export function useSwapEnoughAllowance(): boolean | undefined { + const { chainId, account } = useWalletInfo() + const [inputAmountWithSlippage] = useSwapAmountsWithSlippage() + + const checkAllowanceAddress = GP_VAULT_RELAYER[chainId] + const { enoughAllowance } = useEnoughBalanceAndAllowance({ + account, + amount: inputAmountWithSlippage, + checkAllowanceAddress, + }) + + return enoughAllowance +} diff --git a/apps/widget-configurator/src/app/embedDialog/const.ts b/apps/widget-configurator/src/app/embedDialog/const.ts index 4b7be2e4b5..4b70809e83 100644 --- a/apps/widget-configurator/src/app/embedDialog/const.ts +++ b/apps/widget-configurator/src/app/embedDialog/const.ts @@ -13,7 +13,7 @@ export const COMMENTS_BY_PARAM_NAME: Record = { sell: 'Sell token. Optionally add amount for sell orders', buy: 'Buy token. Optionally add amount for buy orders', enabledTradeTypes: 'swap, limit and/or advanced', - interfaceFeeBips: 'Fill the form above if you are interested', + interfaceFeeBips: '0.5% - COMING SOON! Fill the form above if you are interested', } export const COMMENTS_BY_PARAM_NAME_TYPESCRIPT: Record = { diff --git a/libs/permit-utils/src/index.ts b/libs/permit-utils/src/index.ts index 06bb0ccd7e..91bf0357c9 100644 --- a/libs/permit-utils/src/index.ts +++ b/libs/permit-utils/src/index.ts @@ -1,3 +1,5 @@ +export { PERMIT_SIGNER } from './const' + export { checkIsCallDataAValidPermit } from './lib/checkIsCallDataAValidPermit' export { generatePermitHook } from './lib/generatePermitHook' export { getPermitUtilsInstance } from './lib/getPermitUtilsInstance' diff --git a/libs/ui/src/index.ts b/libs/ui/src/index.ts index f4df9da04b..1c90bbe923 100644 --- a/libs/ui/src/index.ts +++ b/libs/ui/src/index.ts @@ -10,3 +10,4 @@ export * from './pure/Tooltip' export * from './pure/Popover' export * from './pure/ExternalLink' export * from './enum' +export * from './types' diff --git a/libs/ui/src/types.ts b/libs/ui/src/types.ts index d607182ed4..ddc55f84d5 100644 --- a/libs/ui/src/types.ts +++ b/libs/ui/src/types.ts @@ -12,3 +12,5 @@ export type ComposableCowInfo = { isVirtualPart?: boolean isTheLastPart?: boolean } + +export type BadgeType = 'information' | 'success' | 'alert' | 'alert2' | 'default' diff --git a/package.json b/package.json index 463bc1537a..13c01cd4ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cowswap", - "version": "1.49.6", + "version": "1.50.1", "description": "CoW Swap", "main": "index.js", "author": "",