Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
b2ed550
Merge branch 'develop' of https://github.com/cowprotocol/cowswap into…
shoom3301 Apr 28, 2026
4c2286b
chore(i18n): extract i18n strings [automatic]
github-actions[bot] Apr 28, 2026
c09a005
fix: fee calculation logic for high fee warning on sell orders (#7413)
kernelwhisperer Apr 28, 2026
c356c12
feat: add token lists for non-supported chains (#7262)
limitofzero Apr 28, 2026
d1956ca
chore: fix cow.fi build
shoom3301 Apr 29, 2026
713f690
fix: hide sc custom recipient warning for non-evm (#7427)
limitofzero Apr 29, 2026
1e10bed
Merge branch 'develop' of https://github.com/cowprotocol/cowswap into…
shoom3301 Apr 30, 2026
14cc289
fix: hide paste btn if the api denied by settings (#7435)
limitofzero May 4, 2026
0e40b35
fix: Coinbase Sign In preferences (connect with coinbase wallet) (#7443)
lgahdl May 4, 2026
021c3c7
fix(widget): support cow widget with WidgetEthereumProvider (#7432)
shoom3301 May 5, 2026
c7a65bc
feat: allow smart accounts to use gasless off-chain signing (#7451)
lgahdl May 5, 2026
fcd9bbf
fix: adjusting the wallet capabilities, so it doesn't mess up with me…
lgahdl May 6, 2026
5079915
fix: prevent MetaMask embedded browser from getting stuck at swap rou…
lgahdl May 6, 2026
6f6d717
Merge branch 'develop' into release/28-04-2026
limitofzero May 8, 2026
d74c738
fix: build
limitofzero May 8, 2026
487443b
Merge branch 'main' into release/28-04-2026
limitofzero May 11, 2026
d5e11f7
chore: adjust pnpm after merge
limitofzero May 11, 2026
e93bf10
Viem Migration - Upgrade wagmi and handling different tabs wallet con…
lgahdl May 11, 2026
57d4b0f
fix: resolve transitive deps
limitofzero May 8, 2026
146a0c2
chore: revert #7448 (#7487)
shoom3301 May 12, 2026
c993576
fix: permit provider connector (#7488)
limitofzero May 12, 2026
bb80b12
fix(affiliate): gate feedback button by affiliate network state (#7481)
fairlighteth May 12, 2026
51adb38
Merge pull request #7415 from cowprotocol/release/28-04-2026
limitofzero May 12, 2026
ee578b4
chore: release main (#7491)
alfetopito May 12, 2026
b8a3bea
fix: bump version of widget-lib + iframe-transport (#7493)
limitofzero May 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,6 @@ CLAUDE.md
.claude/
.superpowers/**/*

# Codex context files (local only)
.codex

# Agents context files (local only)
.agents/

Expand Down
34 changes: 17 additions & 17 deletions .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
{
"apps/cowswap-frontend": "3.9.2",
"apps/explorer": "4.2.1",
"libs/permit-utils": "3.2.1",
"apps/cowswap-frontend": "3.10.0",
"apps/explorer": "4.3.0",
"libs/permit-utils": "3.2.2",
"libs/widget-lib": "4.0.2",
"libs/widget-react": "3.0.2",
"apps/widget-configurator": "3.4.2",
"libs/analytics": "3.2.1",
"libs/assets": "2.2.1",
"apps/widget-configurator": "3.4.3",
"libs/analytics": "3.2.2",
"libs/assets": "2.3.0",
"libs/common-const": "3.2.1",
"libs/common-hooks": "3.2.1",
"libs/common-utils": "3.3.1",
"libs/core": "3.2.1",
"libs/common-hooks": "3.2.2",
"libs/common-utils": "3.3.2",
"libs/core": "3.2.2",
"libs/currency": "1.0.0",
"libs/ens": "3.2.1",
"libs/ens": "3.2.2",
"libs/events": "4.3.1",
"libs/snackbars": "2.0.21",
"libs/tokens": "3.4.1",
"libs/snackbars": "2.0.22",
"libs/tokens": "3.5.0",
"libs/types": "4.3.1",
"libs/ui": "3.3.1",
"libs/wallet": "3.2.1",
"apps/cow-fi": "2.5.6",
"libs/ui": "3.4.0",
"libs/wallet": "3.3.0",
"apps/cow-fi": "2.5.8",
"libs/wallet-provider": "2.1.17",
"libs/ui-utils": "2.0.1",
"libs/abis": "3.0.0",
"libs/balances-and-allowances": "3.2.1",
"libs/abis": "4.0.0",
"libs/balances-and-allowances": "3.2.2",
"libs/iframe-transport": "2.2.3",
"libs/hook-dapp-lib": "2.2.3",
"libs/multicall": "3.2.1"
Expand Down
27 changes: 27 additions & 0 deletions apps/cow-fi/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Changelog

## [2.5.8](https://github.com/cowprotocol/cowswap/compare/cow-fi-v2.5.7...cow-fi-v2.5.8) (2026-05-12)


### 🐛 Bug Fixes

* resolve transitive deps ([57d4b0f](https://github.com/cowprotocol/cowswap/commit/57d4b0f3236bdec7d3cd489fd663557ea31e6062))


### Dependencies

* The following workspace dependencies were updated
* dependencies
* @cowprotocol/analytics bumped to 3.2.2
* @cowprotocol/assets bumped to 2.3.0
* @cowprotocol/common-hooks bumped to 3.2.2
* @cowprotocol/common-utils bumped to 3.3.2
* @cowprotocol/core bumped to 3.2.2
* @cowprotocol/ui bumped to 3.4.0
* @cowprotocol/wallet bumped to 3.3.0

## [2.5.7](https://github.com/cowprotocol/cowswap/compare/cow-fi-v2.5.6...cow-fi-v2.5.7) (2026-05-08)


### 🐛 Bug Fixes

* bump next version ([#7471](https://github.com/cowprotocol/cowswap/issues/7471)) ([5f0d60f](https://github.com/cowprotocol/cowswap/commit/5f0d60f1933ca435e49138c8c2133341bfd5bf9e))

## [2.5.6](https://github.com/cowprotocol/cowswap/compare/cow-fi-v2.5.5...cow-fi-v2.5.6) (2026-04-30)


Expand Down
10 changes: 6 additions & 4 deletions apps/cow-fi/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cowprotocol/cow-fi",
"version": "2.5.6",
"version": "2.5.8",
"description": "CoW DAO website",
"main": "index.js",
"author": "",
Expand Down Expand Up @@ -50,15 +50,15 @@
"@visx/group": "^3.3.0",
"@visx/responsive": "^3.10.2",
"@visx/shape": "^3.5.0",
"@wagmi/core": "^3.3.1",
"@wagmi/core": "^3.4.8",
"color2k": "^2.0.2",
"csstype": "^3.1.3",
"d3": "^7.8.1",
"date-fns": "^2.29.3",
"exponential-backoff": "^3.1.1",
"jotai": "2.16.2",
"launchdarkly-react-client-sdk": "^3.0.4",
"next": "15.2.8",
"next": "15.5.18",
"polished": "^4.0.5",
"qs": "^6.14.1",
"react": "19.1.2",
Expand All @@ -71,7 +71,7 @@
"styled-components": "5.3.11",
"swiper": "^11.1.1",
"viem": "^2.45.1",
"wagmi": "3.4.2",
"wagmi": "3.6.9",
"workbox-core": "^6.6.1",
"workbox-expiration": "^6.6.1",
"workbox-precaching": "^6.6.1",
Expand All @@ -88,6 +88,8 @@
"@types/rebass": "^4.0.10",
"@types/sortablejs": "^1.15.8",
"@types/styled-components": "5.1.34",
"babel-loader": "^9.1.3",
"babel-plugin-macros": "^3.1.0",
"file-loader": "^6.2.0",
"jest-fetch-mock": "^3.0.3",
"react-cosmos": "^7.0.0"
Expand Down
5 changes: 5 additions & 0 deletions apps/cowswap-frontend-e2e/src/e2e/swapMod.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ describe('Swap (mod)', () => {
it('can enter an amount into input', () => {
cy.visit('/#/11155111/swap')
cy.unlockCrossChainSwap()
cy.get('#input-currency-input .token-amount-input').should('have.value', '1')
cy.get('#input-currency-input .token-amount-input')
.type('{selectAll}{del}')
.type('0.001')
Expand All @@ -27,12 +28,16 @@ describe('Swap (mod)', () => {
it('zero swap amount', () => {
cy.visit('/#/11155111/swap')
cy.unlockCrossChainSwap()
// Wait for the default sell amount to be auto-filled before clearing
cy.get('#input-currency-input .token-amount-input').should('have.value', '1')
cy.get('#input-currency-input .token-amount-input').type('{selectAll}{del}').type('0.0').should('have.value', '0.0')
})

it('invalid swap amount', () => {
cy.visit('/#/11155111/swap')
cy.unlockCrossChainSwap()
// Wait for the default sell amount to be auto-filled before clearing
cy.get('#input-currency-input .token-amount-input').should('have.value', '1')
cy.get('#input-currency-input .token-amount-input').type('{selectAll}{del}').type('\@\@').should('have.value', '')
})

Expand Down
10 changes: 5 additions & 5 deletions apps/cowswap-frontend-e2e/src/support/e2e.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { injected } from './ethereum'
const WAGMI_STORAGE_KEY = 'cowswap-wallet'

/**
* Seed wagmi's localStorage entries so the injected connector is recognised
* Seed wagmi's sessionStorage entries so the injected connector is recognised
* as "previously connected" and `reconnect()` will auto-connect on mount.
*/
function seedWagmiConnectionState(storage: Storage): void {
Expand Down Expand Up @@ -54,8 +54,8 @@ Cypress.Commands.overwrite(
url: url.toString(),
onBeforeLoad(win) {
options?.onBeforeLoad?.(win)
win.localStorage.clear()
seedWagmiConnectionState(win.localStorage)
win.sessionStorage.clear()
seedWagmiConnectionState(win.sessionStorage)
win.ethereum = injected
},
})
Expand Down Expand Up @@ -137,8 +137,8 @@ beforeEach(() => {
})

cy.on('window:before:load', (win) => {
win.localStorage.clear()
seedWagmiConnectionState(win.localStorage)
win.sessionStorage.clear()
seedWagmiConnectionState(win.sessionStorage)
win.ethereum = injected
})
})
49 changes: 49 additions & 0 deletions apps/cowswap-frontend/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,54 @@
# Changelog

## [3.10.0](https://github.com/cowprotocol/cowswap/compare/cowswap-v3.9.2...cowswap-v3.10.0) (2026-05-12)


### ✨ Features

* add AffiliateFeedbackButton ([#7431](https://github.com/cowprotocol/cowswap/issues/7431)) ([74d8348](https://github.com/cowprotocol/cowswap/commit/74d8348e08e6feb30ff738aed6d05d792b1b6db8))
* **explorer:** Explorer bridging debuggin improvements ([#7377](https://github.com/cowprotocol/cowswap/issues/7377)) ([ddd08e2](https://github.com/cowprotocol/cowswap/commit/ddd08e2de277587865f977c82ccec25209a3f113))


### 🐛 Bug Fixes

* **affiliate:** gate feedback button by affiliate network state ([#7481](https://github.com/cowprotocol/cowswap/issues/7481)) ([bb80b12](https://github.com/cowprotocol/cowswap/commit/bb80b12b98983bbba1d17636bd53f15a27c0342e))
* **approval:** use isSafeWallet to check if the transaction is from safe ([#7453](https://github.com/cowprotocol/cowswap/issues/7453)) ([0d651b0](https://github.com/cowprotocol/cowswap/commit/0d651b03388f4ad511b1cf7c56e66aa37885cda4))
* Coinbase Sign In preferences (connect with coinbase wallet) ([#7443](https://github.com/cowprotocol/cowswap/issues/7443)) ([0e40b35](https://github.com/cowprotocol/cowswap/commit/0e40b3503cf3030cd24b105e3ce67a72a8c798e6))
* hide paste btn if the api denied by settings ([#7435](https://github.com/cowprotocol/cowswap/issues/7435)) ([14cc289](https://github.com/cowprotocol/cowswap/commit/14cc2891c532250dfea86b120d9447ae26de138c))
* prevent MetaMask embedded browser from getting stuck at swap route ([#7433](https://github.com/cowprotocol/cowswap/issues/7433)) ([5079915](https://github.com/cowprotocol/cowswap/commit/507991532a1052df91f29d2c45af7a457818f716))
* **swap:** hide MetaMask version warning on mobile browsers ([#7464](https://github.com/cowprotocol/cowswap/issues/7464)) ([c861fbd](https://github.com/cowprotocol/cowswap/commit/c861fbdd7efc26086e645906dd8800e439ead038)), closes [#7462](https://github.com/cowprotocol/cowswap/issues/7462)
* **tradeQuote:** refetch quote immediately after token change ([#7448](https://github.com/cowprotocol/cowswap/issues/7448)) ([adf4a1d](https://github.com/cowprotocol/cowswap/commit/adf4a1dfcc5a8f4c95f1d94c87d96fdbdc0f24ac))
* **widget:** support cow widget with WidgetEthereumProvider ([#7432](https://github.com/cowprotocol/cowswap/issues/7432)) ([021c3c7](https://github.com/cowprotocol/cowswap/commit/021c3c73695113265999aae0c4a1d4dc55d10a71))


### ♻️ Refactoring

* **affiliate:** remove feature flag checks for affiliate program ([#7466](https://github.com/cowprotocol/cowswap/issues/7466)) ([d2d7dab](https://github.com/cowprotocol/cowswap/commit/d2d7dab1ae7e192ed3fbaef88091fe82a572a798))


### 🔧 Miscellaneous

* revert [#7448](https://github.com/cowprotocol/cowswap/issues/7448) ([#7487](https://github.com/cowprotocol/cowswap/issues/7487)) ([146a0c2](https://github.com/cowprotocol/cowswap/commit/146a0c235d4b7e994468ff339a154c95ef60281f))


### Dependencies

* The following workspace dependencies were updated
* dependencies
* @cowprotocol/analytics bumped to 3.2.2
* @cowprotocol/assets bumped to 2.3.0
* @cowprotocol/balances-and-allowances bumped to 3.2.2
* @cowprotocol/common-hooks bumped to 3.2.2
* @cowprotocol/common-utils bumped to 3.3.2
* @cowprotocol/core bumped to 3.2.2
* @cowprotocol/cowswap-abis bumped to 4.0.0
* @cowprotocol/ens bumped to 3.2.2
* @cowprotocol/permit-utils bumped to 3.2.2
* @cowprotocol/snackbars bumped to 2.0.22
* @cowprotocol/tokens bumped to 3.5.0
* @cowprotocol/ui bumped to 3.4.0
* @cowprotocol/wallet bumped to 3.3.0

## [3.9.2](https://github.com/cowprotocol/cowswap/compare/cowswap-v3.9.1...cowswap-v3.9.2) (2026-04-30)


Expand Down
8 changes: 4 additions & 4 deletions apps/cowswap-frontend/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@cowprotocol/cowswap",
"version": "3.9.2",
"version": "3.10.0",
"description": "CoW Swap",
"main": "index.js",
"author": "",
Expand Down Expand Up @@ -69,8 +69,8 @@
"@reach/dialog": "^0.18.0",
"@reach/menu-button": "^0.18.0",
"@react-spring/web": "^9.6.1",
"@reown/appkit": "^1.6.2",
"@reown/appkit-adapter-wagmi": "^1.6.2",
"@reown/appkit": "1.8.16",
"@reown/appkit-adapter-wagmi": "1.8.16",
"@reduxjs/toolkit": "^1.8.0",
"@safe-global/api-kit": "^4.0.1",
"@safe-global/types-kit": "^3.0.0",
Expand Down Expand Up @@ -125,7 +125,7 @@
"tiny-invariant": "^1.2.0",
"use-async-memo": "^1.2.4",
"viem": "^2.42.1",
"wagmi": "^3.1.0",
"wagmi": "^3.6.9",
"workbox-core": "^6.6.1",
"workbox-expiration": "^6.6.1",
"workbox-precaching": "^6.6.1",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
diff --git a/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/client.js b/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/client.js
--- a/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/client.js
+++ b/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/client.js
@@ -10,7 +10,7 @@
import { authConnector } from './connectors/AuthConnector.js';
import { walletConnect } from './connectors/WalletConnectConnector.js';
import { LimitterUtil } from './utils/LimitterUtil.js';
-import { getBaseAccountConnector, getSafeConnector } from './utils/helpers.js';
+import { getCoinbaseWalletConnector, getSafeConnector } from './utils/helpers.js';
const DEFAULT_PENDING_TRANSACTIONS_FILTER = {
enable: false,
pollingInterval: 30_000
@@ -162,9 +162,9 @@
const thirdPartyConnectors = [];
const { enableCoinbase: isCoinbaseEnabled } = OptionsController.state || {};
if (isCoinbaseEnabled !== false) {
- const baseAccountConnector = await getBaseAccountConnector(this.wagmiConfig.connectors);
- if (baseAccountConnector) {
- thirdPartyConnectors.push(baseAccountConnector);
+ const coinbaseConnector = await getCoinbaseWalletConnector(this.wagmiConfig.connectors);
+ if (coinbaseConnector) {
+ thirdPartyConnectors.push(coinbaseConnector);
}
}
const safeConnector = await getSafeConnector(this.wagmiConfig.connectors);
diff --git a/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/utils/helpers.js b/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/utils/helpers.js
--- a/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/utils/helpers.js
+++ b/node_modules/@reown/appkit-adapter-wagmi/dist/esm/src/utils/helpers.js
@@ -1,7 +1,7 @@
import { UniversalProvider } from '@walletconnect/universal-provider';
import {} from 'viem';
import { ConstantsUtil, PresetsUtil } from '@reown/appkit-common';
-import { CoreHelperUtil, WcHelpersUtil } from '@reown/appkit-controllers';
+import { CoreHelperUtil, OptionsController, WcHelpersUtil } from '@reown/appkit-controllers';
export async function getWalletConnectCaipNetworks(connector) {
if (!connector) {
throw new Error('WagmiAdapter:getApprovedCaipNetworks - connector is undefined');
@@ -47,11 +47,12 @@
}
return null;
}
-export async function getBaseAccountConnector(connectors) {
+export async function getCoinbaseWalletConnector(connectors) {
try {
- const { baseAccount } = await import('@wagmi/connectors');
- if (baseAccount && !connectors.some(c => c.id === 'baseAccount')) {
- return baseAccount();
+ const { coinbaseWallet } = await import('@wagmi/connectors');
+ if (coinbaseWallet && !connectors.some(c => c.id === 'coinbaseWalletSDK')) {
+ const preference = (OptionsController.state || {}).coinbasePreference ?? 'all';
+ return coinbaseWallet({ preference });
}
}
catch (error) {
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,15 @@ import { useLocation } from 'react-router'

import { useNavigate } from 'common/hooks/useNavigate'

// Trade routes that handle their own chain resolution (e.g. via SwapPageRedirect).
// Setting ?chain= on these paths causes unnecessary navigation that races with their own redirect logic.
const CHAINLESS_TRADE_ROUTES = ['/swap', '/limit', '/advanced', '/yield']

/**
* Updates the URL to reflect the selected chain:
* - When the path has a chain segment (e.g. /42161/swap), replaces it with the new chainId so the URL stays in sync.
* - When on the root path (/), does nothing — the router's redirect flow will resolve to the correct trade URL.
* - When on the root path (/) or a chainId-less trade route (/swap, /limit, etc.), does nothing —
* the router's redirect flow will resolve to the correct trade URL.
* - Otherwise sets the legacy query parameter ?chain=...
*/
export function useLegacySetChainIdToUrl(): (chainId: SupportedChainId) => void {
Expand All @@ -28,9 +33,10 @@ export function useLegacySetChainIdToUrl(): (chainId: SupportedChainId) => void
return
}

// On the root path, the router redirects to the swap page which will resolve the correct chain.
// Setting ?chain= here would leave the app stuck with no matching trade route.
// On the root path or chainId-less trade routes, the page itself handles chain resolution.
// Setting ?chain= here races with that redirect logic and can leave the widget stuck.
if (pathname === '/') return
if (CHAINLESS_TRADE_ROUTES.some((r) => pathname === r || pathname.startsWith(r + '/'))) return

const chainInfo = getChainInfo(chainId)
if (!chainInfo) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export function ReceiverPanelHeader({ onChange, value, targetChainId, label }: R
const { t } = useLingui()
const { chainIcon, chainInfo, isNonEvm } = useReceiverChainInfo(targetChainId)
const { isEmpty, isError, explorerUrl } = useReceiverValidation(value, targetChainId)
const { handlePaste, handleClear, handleScan, showQrModal, setShowQrModal } = useReceiverActions(onChange)
const { handlePaste, handleClear, handleScan, showQrModal, setShowQrModal, canPaste } = useReceiverActions(onChange)

const { isQrScanEnabled } = useAtomValue(featureFlagsAtom)
const networkName = chainInfo?.label
Expand All @@ -59,7 +59,7 @@ export function ReceiverPanelHeader({ onChange, value, targetChainId, label }: R
<Trans>Scan</Trans>
</ActionBtn>
)}
{showScanPaste && (
{showScanPaste && canPaste && (
<ActionBtn onClick={handlePaste}>
<Trans>Paste</Trans>
</ActionBtn>
Expand Down
Loading
Loading