Skip to content

Release 18-05-2026#7521

Open
shoom3301 wants to merge 38 commits into
mainfrom
release/18-05-2026
Open

Release 18-05-2026#7521
shoom3301 wants to merge 38 commits into
mainfrom
release/18-05-2026

Conversation

@shoom3301
Copy link
Copy Markdown
Collaborator

@shoom3301 shoom3301 commented May 18, 2026

limitofzero and others added 30 commits May 9, 2026 00:14
* fix: bump next version (#7471)

* chore: release main (#7472)

* fix: resolve transitive deps

* chore: specify exact version for @next/swc-linux-x64-gnu in pnpm (#7477)

---------

Co-authored-by: Leandro <alfetopito@users.noreply.github.com>
Co-authored-by: kernelwhisperer <hello@danielconstantin.net>
…av/title behavior (#7470)

* feat(account): use account layout for account proxy and align nav/title behavior

* chore(i18n): extract i18n strings [automatic]

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* feat (explorer): add wrapper designation to order details

Renders a "Wrappers" row in the verbose order details table for orders
whose appData references known wrapper contracts. Wrapper-specific UI
is code-split and loaded on demand; unknown addresses fall back to
fetching the contract name() on-chain.

Supported wrappers:
- OrderFlowFactory (bridge & swap)
- Euler EVC – Open Position, Close Position, Collateral Swap

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* remove references to orderflow

shouldn't be in this pr

* fix build error

* feat: improve explorer wrapper details display and code quality

- Add tooltip for unknown wrappers explaining missing details
- Lift contract name lookup into WrapperEntry header
- Key wrapper rows by address+data to avoid React reconciliation collisions
- Use getAddressKey() from cow-sdk for registry lookup
- Remove non-null assertions in _vaultLookup.ts with proper SWR guards
- Fix getPublicClient with explicit return type and early-return pattern
- Fix import ordering across touched files
- Extract *View sub-components to reduce per-function complexity
- Delete unused unknown.tsx wrapper component

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: split eulerEvc.tsx into per-wrapper files

Move each wrapper component into its own file under eulerEvc/ with
shared styled components and helpers extracted to common.tsx.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: move Euler vault hooks to hooks/euler/

Split _vaultLookup.ts into dedicated files under hooks/euler/:
abis.ts, client.ts, and one file per hook. Dropped three hooks that
had no callers (useVaultBalance, useVaultDebt, useNativePrice).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* refactor: use AddressKey type, shortenAddress, direct React imports, multicall

- Type address parameters as AddressKey from @cowprotocol/cow-sdk
- Replace manual address slicing with shortenAddress from @cowprotocol/common-utils
- Import ComponentType/ReactElement directly instead of via React. prefix
- Batch ERC20 symbol/name/decimals reads in useVaultAsset into a single multicall

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* add import for detail row/tooltips

* use jotai for state management, and remove unnecessary orderflow file (should be separate PR)

* lint fix and resolve deprecated dependency

* fix design issues as suggested

* fix word wrap

* try to fix pnpm lock

* docs(explorer): add UI and code conventions to AGENTS.md (#7459)

* docs(explorer): add UI and code conventions to AGENTS.md

Standards identified through review feedback on #7404:
- Link display: ↗ suffix rules, parenthesis placement, flex gap pitfall
- Token display: TokenImg icon placement, orange link colour via Color.explorer_textActive
- Text wrapping: word-break override inside RenderedData
- State caching: use jotai/jotai-family instead of module-level Map
- Address utilities: AddressKey type, shortenAddress, getAddressKey for lookups
- React imports: named imports over React.X prefix
- Contract reads: batch with multicall instead of separate readContract calls
- Hook organisation: one hook per file under a domain directory
- Component shape: *View sub-component pattern for lint compliance
- Pre-commit checklist: lint and dead-code removal

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* try to fix pnpm lock

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: re-organize Euler wrapper-realted components and update layout to work on narrow vieports

* fix: rename Euler-related files

* fix: rename Euler-related files

* refactor: fix typo in function name

* fix: remove jotai-family and revert dependency changes

* feat: introduce FiniteMap and use it for Euler's getPublicClient cache

* fix: narrow down deps of useEffect in OrderWrapperDetailsItem

* fix: fix FiniteMap eviction logic when accessing missing keys

* fix: add wrapper to TokenLink

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fairlight <31534717+fairlighteth@users.noreply.github.com>
Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>
Co-authored-by: Dani Gámez Franco <gmzcodes@outlook.com>
* feat: integrate Storybook into the project

* refactor(storybook): move storybook to apps

* feat(storybook): add Storybook deps to libs/ui

* ci: remove storybook build step

* fix(storybook): local scripts

* fix(storybook): remove HOME environment override

* refactor: storybook setup and stories

* feat(storybook): change bg default to paper auto

---------

Co-authored-by: fairlighteth <31534717+fairlighteth@users.noreply.github.com>
* feat: enhance analytics for bridging and cross-chain orders

* chore(i18n): extract i18n strings [automatic]

* test: add PendingBridgeOrdersUpdater tests and analytics event assertions

* chore(i18n): extract i18n strings [automatic]

* fix: update analytics event payload

* feat(analytics): enhance bridge order handling in analytics events

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>
* chore(i18n): extract i18n strings [automatic]

* fix: fee calculation logic for high fee warning on sell orders (#7413)

* feat: add token lists for non-supported chains (#7262)

* fix: token check from storage

* feat: update sdk

* fix: use proper address comparison

* fix: proper address

* fix: wrapped tokens

* fix: resolution

* feat: add sol/btc receiver

* fix: pnpm

* fix: bridge receiver

* chore: update deps

* feat: fix order status

* fix: handle unsupported non-evm chain id

* chore: bump version

* refactor: add validation strategy

* refactor: move hooks

* refactor: rename files

* fix: native currency price for non evm

* fix: token prices

* chore: bump sdk

* chore: bump version

* chore: update lock

* fix: tests

* fix: handle non evm addresses in search

* fix: token explorer address for non-evm

* fix: getWrappedToken

* fix: native tokens for explorer

* fix: build

* fix: test

* fix: address

* fix: address 2

* chore: remove todo

* fix: check btc/sol address per chain

* fix: bug in hook

* fix: typecheck

* chore: refactor: use isSol helper

* fix: block-explorer link on sol

* refactor: isSolana

* chore: comment

* feat: add default recepient for btc/sol to get first quote

* feat: update addresses

* feat: add guard to prevent trading with default quote address for sol/btc

* feat: add token lists for non-supported chains

* refactor: more clear functions

* refactor: more clear functions

* refactor: helpers

* refactor: nitpick

* refactor: naming

* refactor: btc stablecoind ref

* fix: address

* refactor: reuse patterns from sdk

* fix: don't show receiver for non-evm default address

* fix: recipient

* fix: recipient address in bridge detales

* chore: bump sdk

* fix: format receiver

* fix: ens tooltip

* fix: hide confirm button for SC if recipient is not entered

* fix: hide recipient when account is not connected

* chore: remove dead comments

* fix: tests

* fix: fallback to default recipient when receiver is not valid

* fix: token path

* fix: loading

* fix: token urls

* fix: add native currency check

* fix: token loading

* fix: list validation

* fix: list validation

* refactor: naming

* fix: native tokens

* fix: use chain stab for explorer

* fix: map tokens

* chore(i18n): extract i18n strings [automatic]

---------

Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* chore: fix cow.fi build

* fix: hide sc custom recipient warning for non-evm (#7427)

* fix: hide paste btn if the api denied by settings (#7435)

* fix: hide paste btn if the api denied by settings

* fix: handle rerender

---------

Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>

* fix: Coinbase Sign In preferences (connect with coinbase wallet) (#7443)

* feat(patch): applying a patch to fix coinbase wallet connection;

* fix: fixing the build by applying patch using patch-package

---------

Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>

* fix(widget): support cow widget with WidgetEthereumProvider (#7432)

* fix(widget): fix ready event listener

* fix(widget): support cow widget with WidgetEthereumProvider

* chore: sync wagmi versions

* chore: dedupe wagmi

* fix: fix standaloneMode

* fix: not connecting safe on widget-configurator

* fix: removing cow wallet from wallets list

* chore: update sdk and simplify deps (#7414)

* chore: update sdk and simplify deps

* chore(i18n): extract i18n strings [automatic]

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Denis Makarov <limitofzero@gmail.com>

* fix: fixing wallet connection in dapp mode;

* fix(wallet): disable AppKit in Safe App iframes to prevent postMessage conflicts

* chore: removing unused log

* chore: updating pnpm-lock.yaml

---------

Co-authored-by: Luiz Gustavo Abou Hatem de Liz <luizgustavoahsc@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Denis Makarov <limitofzero@gmail.com>
Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>

* feat: allow smart accounts to use gasless off-chain signing (#7451)

* fix(wallet): allow smart accounts to use gasless off-chain signing

* fix(twap): detect EIP-7702 accounts as unsupported for TWAP
fix(wallet): allow gasless signing for smart contract wallets

* fix: applying the offchain signing support only for EOA and Metamask smart accounts

* fix: adjusting the wallet capabilities, so it doesn't mess up with metamask smart wallet (#7455)

Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>

* fix: prevent MetaMask embedded browser from getting stuck at swap route (#7433)

* fix: build

* chore: adjust pnpm after merge

* Viem Migration - Upgrade wagmi and handling different tabs wallet connection (#7467)

* fix(widget): fix ready event listener

* fix(widget): support cow widget with WidgetEthereumProvider

* chore: sync wagmi versions

* chore: dedupe wagmi

* fix: fix standaloneMode

* fix: not connecting safe on widget-configurator

* fix: removing cow wallet from wallets list

* fix: fixing wallet connection in dapp mode;

* fix(wallet): isolate safe and regular contexts

* fix(wallet): prevent Safe iframe from disconnecting browser tab via wallet_revokePermissions

When SafeConnectionHandler switched from the injected connector to the safe
connector inside a Safe App iframe, it called wagmi's disconnect() which
internally calls wallet_revokePermissions on MetaMask. Since MetaMask manages
permissions per origin (not per tab), this revoked the eth_accounts permission
for the entire localhost:3000 origin, causing any open browser tab at that
URL to lose its wallet connection.

Fix: write the shimDisconnect storage flag directly instead of calling
disconnect(). This prevents the connector from being reconnected on next load
without touching MetaMask's global permissions. The connectSafeInIframe effect
still runs and makes the safe connector the active connection.

Also introduce IS_CROSS_ORIGIN_IFRAME — a one-time check that distinguishes
genuine cross-origin iframes (Safe App) from same-origin ones (browser
extensions like Loom or 1Password that also run inside iframes). This ensures
SafeConnectionHandler only activates in actual cross-origin contexts.

* fix: isolate iframe and regular tabs on storage

* fix(wallet): eliminate safe iframe blink when switching wallets in regular tab

* fix(wallet): remove injected iframe from safe

* fix(wallet): skip AppKit in Safe iframe to eliminate cross-tab interference

* fix(wallet): disable AppKit in Safe App iframes to prevent postMessage conflicts

* chore: removing unused log

* chore: updating pnpm-lock.yaml

* chore: updating pnpm-lock;

* fix: putting back the isInSafeSdkContext variable, removed by accident

* fix(widget): remove appkit from all iframes

* fix(widget): remove AppKit from all cross-origin iframe contexts

AppKit was being initialised inside the injected widget (cross-origin
iframe), causing localStorage key conflicts with the host app — connecting
in the widget would auto-connect the standalone app, and disconnecting the
app would disconnect the widget.

Skip AppKit for all cross-origin iframes (both Safe App and injected widget)
instead of only the Safe iframe. Each context already gets a distinct wagmi
storage key, so session state remains isolated. The addWagmiConnector modal
patch is no longer needed since AppKit doesn't run in the widget.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(wallet): remove @appkit/* clearing and injected connector from widget

- Stop clearing @appkit/* keys on widget init — this was wiping the main
  app's AppKit state, causing two-step disconnect and stale Account view.
- Remove plain injected connector from widget — MetaMask is a per-origin
  singleton, registering it leaked wallet state between widget and app.
- Disable EIP-6963 in widget to prevent auto-detecting the main app's
  injected wallet.
- Keep Storage.prototype interception to redirect widget's @appkit/*
  operations to sessionStorage, preventing cross-tab storage events.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(wallet): applies to all iframes

* Revert "Merge remote-tracking branch 'origin/develop' into bruno/cow-925-connection-issues-when-the-app-is-opened-in-safe-and-in-a"

This reverts commit c7ffaef, reversing
changes made to 36292eb.

* chore(wallet): connect both tabs on the same extension (rabby and metamask)

* fix(wallet): disable AppKit auto-reconnect in widget to prevent duplicate eth_requestAccounts
fix: upgrade wagmi, wagmi core and wagmi connectors

* fix: fixing typecheck;

* fix: separate standalone widget from dapp

* fix: auto reconnect to the last wallet in regular app tab

* fix: fixing e2e tests

* fix: dont connect on disconnected tabs when switching wallet account

* fix: address review comments

* fix: resolve bot comments

* fix: resolve last comments

* chore: adding wagmi, @wagmi/* and viem back to the release age filter

* fix: develop conflicts after revert commit

* fix: pnpm.lock

---------

Co-authored-by: Alexandr Kazachenko <shoom3301@gmail.com>
Co-authored-by: brunota20 <brunot.anjos@gmail.com>
Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Denis Makarov <limitofzero@gmail.com>

* fix: resolve transitive deps

* chore: revert #7448 (#7487)

* fix: permit provider connector (#7488)

* fix: permit provider connector

* fix: handle eip1271 permit case

* Revert "fix: handle eip1271 permit case"

This reverts commit d61cb43.

---------

Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>

* fix(affiliate): gate feedback button by affiliate network state (#7481)

* chore: release main (#7491)

* fix: bump version of widget-lib + iframe-transport (#7493)

* fix: bump version of widget-lib + iframe-transport

* chore: add jsdock

* chore: fix

* revert: minimumReleaseAgeExclude next/*

---------

Co-authored-by: Alexandr Kazachenko <shoom3301@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: kernelwhisperer <hello@danielconstantin.net>
Co-authored-by: Elena <70885163+elena-zh@users.noreply.github.com>
Co-authored-by: Luiz Gustavo Abou Hatem de Liz <50002794+lgahdl@users.noreply.github.com>
Co-authored-by: Luiz Gustavo Abou Hatem de Liz <luizgustavoahsc@gmail.com>
Co-authored-by: brunota20 <brunot.anjos@gmail.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: fairlight <31534717+fairlighteth@users.noreply.github.com>
Co-authored-by: Leandro <alfetopito@users.noreply.github.com>
…idation (#7406)

* fix(widget-configurator): reject non-HTTP(S) schemes in validateURL

* refactor: replace validateURL with isValidTokenListSource for URL validation

---------

Co-authored-by: Daniel Constantin <hello@danielconstantin.net>
* refactor: copy to clipboard button

* chore: i18n
* chore: write stories for CopyButton and Tooltip

* feat(CopyButton): add HoverTooltip for copy feedback

* fix(tooltip): use BaseUI tooltip for HoverTooltip

* fix: typescript error

* fix: another typescript error

* feat(Tooltip): introduce NewTooltip component alongside the old one

* feat(Tooltip): refactor NewTooltip component and update imports

* docs(Tooltip): update deprecation notice for HoverTooltip to use NewTooltip

* feat(Tooltip): add ms.macro for time duration handling

* feat(affiliate): replace CopyHelper with CopyButton

* chore(i18n): extract i18n strings [automatic]

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…elop

chore(sync): merge main into develop
# Summary

Fixes
https://linear.app/cowswap/issue/COW-224/notification-on-linked-code

Adds a persistent “Rewards activated” notification after a fulfilled
order links the trader’s saved affiliate referral code.

The notification:
- marks the saved affiliate code as linked locally
- shows the linked code and rewards window duration
- links to the trader rewards page
- stays visible until dismissed

Also adds Storybook coverage for the notification and updates snackbar
behavior so `duration={0}` creates a persistent snackbar without a
progress fader.

# To Test

1. Save a valid affiliate referral code locally, then complete a trade

- [ ] Verify the order-filled notification includes “Rewards activated”
- [ ] Verify the notification shows the saved referral code
- [ ] Verify the copy uses the affiliate program duration
- [ ] Verify clicking “View rewards” opens the affiliate trader rewards
page
- [ ] Verify the notification remains visible until dismissed

2. Complete another fulfilled order after the code is already linked

- [ ] Verify the rewards activation notification is not shown again


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a notification that displays when your affiliate referral code
is successfully linked, showing the code details and reward activation
timeline with a "View rewards" link to access your affiliate rewards
dashboard.

* **Improvements**
* Enhanced snackbar notification behavior with improved display handling
and better control over notification duration management for a smoother
user experience.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cowprotocol/cowswap/pull/7514)

<!-- review_stack_entry_end -->

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
# Summary

Allow the `xStocks` token-list tag from the Backed xStocks token list to
be shown in the token selector. This matches the existing Circle/Ondo
issuer-tag flow: when a token list defines a supported top-level tag and
tokens reference it, the selector can render the tag label and tooltip.

Tag labels/descriptions that follow known issuer templates are now
translation-ready while preserving the issuer supplied by the token
list. For example, `Tokenized by xStocks` is handled as `Tokenized by
{issuer}`, with `xStocks` coming from the token-list payload rather than
a hardcoded tag-id map.

<img width="1439" height="2417" alt="Screenshot_20260514_152432"
src="https://github.com/user-attachments/assets/514c4fd4-f63c-4f19-a3d1-8e8215ad42b6"
/>

Also removes the now-unneeded explicit-function-return-type lint
suppression from `TokensListsTagsUpdater` by annotating the updater
return type.

# To Test

Important geo note: the xStocks token list follows the RWA
restricted-list flow added in #7073. The currently restricted country
codes are `AF`, `DZ`, `BY`, `CA`, `CN`, `CU`, `KP`, `ER`, `IR`, `LY`,
`MM`, `MA`, `NP`, `RU`, `SO`, `SS`, `SD`, `SY`, `US`, `VE`, `AT`, `BE`,
`BG`, `HR`, `CY`, `CZ`, `DK`, `EE`, `FI`, `FR`, `DE`, `GR`, `HU`, `IE`,
`IT`, `LV`, `LT`, `LU`, `MT`, `NL`, `PL`, `PT`, `RO`, `SK`, `SI`, `ES`,
`SE`, `IS`, `LI`, and `NO`. For the positive tag-rendering path, QA
should use a country/VPN outside that list or a test setup where
`isRwaGeoblockEnabled` is disabled. If the geo API is blocked/unknown,
the existing consent flow may apply instead.

1. Open CoW Swap from this branch on a supported network with the
xStocks token list, for example Ethereum, BNB, Arbitrum, or Ink, from a
non-restricted geo.

- [ ] Open token list settings and enable/import the xStocks token list
if it is not already enabled.
- [ ] Open the token selector.
- [ ] Search for an xStocks token such as `AAPLx` or `AMZNx`.
- [ ] Verify the token row shows the `Tokenized by xStocks` tag.
- [ ] Hover/focus the tag and verify the tooltip says `Asset officially
issued by xStocks`.
- [ ] Search for a Circle-tagged token such as `USDC` and verify the
existing `Issued by Circle` tag still renders.
- [ ] Search for an Ondo-tagged token, if available on the selected
network and geo, and verify the existing Ondo tag still renders.
- [ ] In a non-English locale, verify the generic issuer wording is
translated while the issuer name from the token list remains unchanged.

2. Confirm restricted-geo behavior remains unchanged.

- [ ] Test from any country in the restricted-country list above.
- [ ] Verify the xStocks list/tokens are not available in the token
selector due to the existing RWA geoblock rules.
- [ ] Verify this PR does not bypass the restriction; it only enables
the tag once the token is otherwise visible.

3. Confirm there are no new token-list regressions.

- [ ] Disable and re-enable the xStocks token list in token list
settings, then reopen the token selector.
- [ ] Verify xStocks tokens appear only when their list is enabled and
not geo-blocked.
- [ ] Verify unrelated tokens without token-list tags do not show the
xStocks tag.

Cache note: if testing on an environment that previously loaded token
lists/restricted lists, use incognito or clear local token-list/CMS
caches such as `cmsRestrictedTokenLists:v0`; #7073 called out stale
cache behavior around this list.

# Background

The Backed token list already defines a top-level `xStocks` tag and
assigns it to xStocks tokens, but the frontend only imports metadata for
explicitly allowed token-list tags. This PR allowlists that tag id so
the existing renderer can show it.

Runtime token-list strings cannot be translated wholesale because Lingui
needs static message templates at build time. The implementation
therefore recognizes exact incoming templates such as `Tokenized by
<issuer>` and `Asset officially issued by <issuer>`, translates only the
static wording, and keeps `<issuer>` from the token-list string.

Related: #7073 added the xStocks token list and RWA restriction
behavior.

Local verification:
- `pnpm exec eslint
libs/tokens/src/updaters/TokensListsTagsUpdater/index.ts`
- `pnpm exec eslint
apps/cowswap-frontend/src/modules/tokensList/pure/TokenTags/index.tsx
apps/cowswap-frontend/src/modules/tokensList/pure/TokenTags/tokenListTagText.utils.ts
apps/cowswap-frontend/src/modules/tokensList/pure/TokenTags/tokenListTagText.utils.test.ts`
- `pnpm exec jest
apps/cowswap-frontend/src/modules/tokensList/pure/TokenTags/tokenListTagText.utils.test.ts
--config apps/cowswap-frontend/jest.config.mjs --runInBand`

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added support for the xStocks tokenlist tag.
* **Localization**
* Added English, Spanish, and Russian translations for issuer-related
token tag text.
* Token tag labels and descriptions are now translated and normalized
before display.
* **Tests**
  * Added unit tests covering token tag translation and handling.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cowprotocol/cowswap/pull/7510?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
brunota20 and others added 6 commits May 18, 2026 16:21
# Summary

Fixes:
1. `fix` a loophole allowing you to create a code that was used on
staging and get those rewards. Now the 2 environments are separated by
appData's environment value.
```
production, staging, ens -> affiliate prod
local, development, pr -> affiliate staging
barn -> excluded
```
2. `fix` handle fee bps being null in SQL queries
3. `fix` active traders being computed wrongly
4. `feat` allow to deny addresses in payouts
5. `feat` new dashboard to check for missing fee & missing env
6. `chore` new query to analyze [ETH-flow orders are not included into
referral
volume](https://www.notion.so/cownation/ETH-flow-orders-are-not-included-into-referral-volume-3298da5f04ca80dc9fa6f22c95c77b39)

Context:

1. If you review commit by commit you will see that I tried to fix the
prod & staging conflict using a start_date param, cutting of trades done
before the prod lauch date. This was naive and cause the check for
"traders to not have previous cowswap trades" to fail. The proper fix
was to check the environment in the app data.
2. I already updated the [dashboards in prod &
staging](https://www.notion.so/cownation/Affiliate-program-internal-docs-3358da5f04ca808baf92f6d9d761e038).
3. I added fac_trades.sql for reference, and imported traders activity
from #7164 as it can be used for debugging

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Enhanced affiliate eligibility tracking with volume-capping, detailed
reason codes, new trade/activity reports, and debugging/data-inspection
views.
  * Payouts can now exclude specified denied addresses.

* **Bug Fixes**
  * Missing fee volumes now treated as zero (fixes low-fee handling).
* Tightened first-trade/referrer logic and improved environment-based
filtering.
  * Removed an outdated fixed date filter affecting payouts.

* **Chores**
* Added richer per-trade fee breakdowns with daily USD/ETH conversions;
removed unused fee column from outputs.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/cowprotocol/cowswap/pull/7188?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@vercel
Copy link
Copy Markdown

vercel Bot commented May 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cowfi Ready Ready Preview May 18, 2026 1:23pm
explorer-dev Ready Ready Preview May 18, 2026 1:23pm
storybook Ready Ready Preview May 18, 2026 1:23pm
swap-dev Ready Ready Preview May 18, 2026 1:23pm
widget-configurator Ready Ready Preview May 18, 2026 1:23pm
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
cosmos Ignored Ignored May 18, 2026 1:23pm
sdk-tools Ignored Ignored Preview May 18, 2026 1:23pm

Request Review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 18, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 71830467-ab5c-44c9-8ffb-c8d540a65ce4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release/18-05-2026

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@socket-security
Copy link
Copy Markdown

socket-security Bot commented May 18, 2026

@cloudflare-workers-and-pages
Copy link
Copy Markdown

cloudflare-workers-and-pages Bot commented May 18, 2026

Deploying swap-dev with  Cloudflare Pages  Cloudflare Pages

Latest commit: 6a26349
Status: ✅  Deploy successful!
Preview URL: https://38dd404b.swap-dev-5u6.pages.dev
Branch Preview URL: https://release-18-05-2026.swap-dev-5u6.pages.dev

View logs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

RELEASE Included in the release that is being closed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants