Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
329 commits
Select commit Hold shift + click to select a range
603af35
Merge branch 'feat/token-selector-2' into feat/token-selector-3
fairlighteth Dec 3, 2025
aa7fa8f
refactor: decompose TokenSeachContent component
fairlighteth Dec 3, 2025
e0daf21
test: add comprehensive tests for useSearchRows hook in TokenSearchCo…
fairlighteth Dec 3, 2025
90ccb79
refactor: simplify token creation in useSearchRows tests
fairlighteth Dec 3, 2025
6bce153
Merge branch 'feat/token-selector-3' into feat/token-selector-4
fairlighteth Dec 3, 2025
6f77199
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 3, 2025
aa864e8
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 3, 2025
bc32977
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 3, 2025
bcd4762
refactor: replace legacy chain selector function with a dedicated com…
fairlighteth Dec 3, 2025
a66315f
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 3, 2025
9e5e616
refactor: streamline ChainsSelector component and enhance loading sta…
fairlighteth Dec 3, 2025
b533601
refactor: clean up getChainAccent function by removing unnecessary wh…
fairlighteth Dec 3, 2025
2aff086
test: add unit tests for getChainAccent function to validate chain ac…
fairlighteth Dec 3, 2025
e51d246
refactor: revert po changes
fairlighteth Dec 3, 2025
2389dee
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 4, 2025
af4595b
Merge branch 'develop' into feat/token-selector-1
fairlighteth Dec 4, 2025
9817979
refactor: update TokenLogo component
fairlighteth Dec 4, 2025
fcae04e
fix: disable lint rule for useVirtualizer hook compliance
fairlighteth Dec 4, 2025
8ba8474
Merge branch 'develop' into feat/token-selector-1
fairlighteth Dec 4, 2025
b43d69c
Merge branch 'feat/token-selector-1' into feat/token-selector-2
shoom3301 Dec 4, 2025
f8d5be8
Merge branch 'develop' into feat/token-selector-1
fairlighteth Dec 4, 2025
1216290
Merge branch 'feat/token-selector-1' into feat/token-selector-2
fairlighteth Dec 4, 2025
02ebfbc
Merge branch 'develop' into feat/token-selector-2
fairlighteth Dec 4, 2025
471fa59
Merge branch 'feat/token-selector-2' into feat/token-selector-3
fairlighteth Dec 4, 2025
6a9eb96
Merge branch 'feat/token-selector-3' into feat/token-selector-4
fairlighteth Dec 4, 2025
8de893f
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 4, 2025
8fb1e21
Merge branch 'develop' into feat/token-selector-3
fairlighteth Dec 4, 2025
dada4db
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 4, 2025
77f4825
Merge branch 'feat/token-selector-3' into feat/token-selector-4
fairlighteth Dec 4, 2025
0f1632a
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 4, 2025
4d4e02a
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 4, 2025
49a3fe6
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 4, 2025
6cd8c95
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 4, 2025
a5328d9
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 4, 2025
f86ef33
refactor(tokensList): modularize FavoriteTokensList component
fairlighteth Dec 4, 2025
c03dfde
refactor(tokensList): replace renderTokensView function with TokensVi…
fairlighteth Dec 4, 2025
e07df07
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 4, 2025
374755b
refactor: rename renderValue function to formatValue for clarity
fairlighteth Dec 4, 2025
615da19
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 4, 2025
ab0d88f
refactor: implement SelectTokenWidget helper functions
fairlighteth Dec 4, 2025
020cc7f
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 4, 2025
d372f05
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 4, 2025
6587732
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 4, 2025
b34da00
feat(token-selector): implement SelectTokenWidget helper functions an…
fairlighteth Dec 4, 2025
a38e5b7
Merge remote-tracking branch 'origin/feat/token-selector-7' into feat…
fairlighteth Dec 4, 2025
fe91216
Merge remote-tracking branch 'origin/feat/token-selector-8' into feat…
fairlighteth Dec 4, 2025
52dc3a4
Merge remote-tracking branch 'origin/feat/token-selector-9' into feat…
fairlighteth Dec 4, 2025
d77a522
fix: revert token list url
fairlighteth Dec 4, 2025
05327ab
feat: enhance localization support in ChainPanel and SelectTokenModal…
fairlighteth Dec 4, 2025
655226a
fix: update ManageListsAndTokens component to include onDismiss prop
fairlighteth Dec 4, 2025
4e22948
fix: correct Russian plural form for 'View all {totalChains} networks'
fairlighteth Dec 4, 2025
3ac256b
fix: update Spanish and Russian translations for cross-chain swap ter…
fairlighteth Dec 4, 2025
d4f7460
fix: refine Russian translations for cross-chain swap terminology
fairlighteth Dec 4, 2025
50c46c3
fix: add Spanish and Russian translations for 'Recent' in TokensVirtu…
fairlighteth Dec 4, 2025
9a01bf3
fix: add Spanish and Russian translations for 'Clear' in TokensVirtua…
fairlighteth Dec 4, 2025
abfc412
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 4, 2025
1c37238
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 4, 2025
6af1305
refactor: rename and modularize SelectTokenWidget helper functions
fairlighteth Dec 5, 2025
23b8ff2
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 5, 2025
b5805b4
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 5, 2025
4f175e1
fix: conditionally render SelectTokenWidget based on token selection …
fairlighteth Dec 5, 2025
b863b55
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 5, 2025
5235543
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 5, 2025
ef97c76
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 5, 2025
84f18d8
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 5, 2025
a1a9dcf
fix: update chain selection logic for advanced trade types to prevent…
fairlighteth Dec 5, 2025
24c41b7
test: enhance useChainsToSelect tests for various trade types and cha…
fairlighteth Dec 5, 2025
0c1ce15
feat: integrate feature flag for bridging enablement in BridgingEnabl…
fairlighteth Dec 5, 2025
9eea62d
test: add unit tests for BridgingEnabledUpdater component to validate…
fairlighteth Dec 5, 2025
8b95820
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 5, 2025
2a0bc99
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 5, 2025
7ae47c0
feat: add support for disabled chain IDs in token selection logic
fairlighteth Dec 5, 2025
356481e
feat: add Spanish and Russian translations for unsupported destinatio…
fairlighteth Dec 5, 2025
a1bab01
refactor: remove debug logging from useChainsToSelect hook to clean u…
fairlighteth Dec 5, 2025
5c5cd01
feat: implement tooltip for disabled chains in MobileChainSelector
fairlighteth Dec 5, 2025
cef77ae
feat: add useRoutesAvailability hook and integrate into chain selecti…
fairlighteth Dec 9, 2025
251d354
fix: update Russian translation for unsupported destination message i…
fairlighteth Dec 9, 2025
76e8c2f
Merge branch 'develop' into feat/token-selector-3
fairlighteth Dec 9, 2025
6fbcec3
Merge branch 'feat/token-selector-3' into feat/token-selector-4
fairlighteth Dec 9, 2025
015ff94
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 9, 2025
e370149
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 9, 2025
601257c
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 9, 2025
b55e993
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 9, 2025
fdb5371
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 9, 2025
2925980
Merge remote-tracking branch 'origin/feat/token-selector-9' into feat…
fairlighteth Dec 9, 2025
17ce84f
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 9, 2025
ceaea87
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 9, 2025
361fe68
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 9, 2025
4f62a58
refactor: remove unused modal content components and update imports i…
fairlighteth Dec 10, 2025
54ce95d
refactor: streamline SelectTokenWidget by removing unused components …
fairlighteth Dec 10, 2025
a140cf0
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 10, 2025
ad53463
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 10, 2025
33f0771
feat: add useCloseTokenSelectWidget hook and update imports in TradeW…
fairlighteth Dec 10, 2025
b3783a7
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 10, 2025
32d9b94
refactor: replace TokensContentSection with TokensContent
fairlighteth Dec 10, 2025
6f0f123
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 10, 2025
daf2d38
refactor: separate getChainAccent function into its own file and upda…
fairlighteth Dec 10, 2025
8c022f3
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 10, 2025
69f8317
refactor: remove SelectTokenWidget helper functions and types to stre…
fairlighteth Dec 10, 2025
3befb75
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 10, 2025
54687d1
refactor: remove unused props from SelectTokenModal to simplify compo…
fairlighteth Dec 10, 2025
6ff9da6
refactor: remove SelectTokenModalContent and update types in SelectTo…
fairlighteth Dec 10, 2025
81d4e84
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 10, 2025
996b963
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 10, 2025
4798560
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 10, 2025
b01ecc7
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 10, 2025
9e65c5b
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 10, 2025
512d1c8
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 10, 2025
5452d8e
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 10, 2025
8d80fdf
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 10, 2025
212b74e
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 10, 2025
b29be06
refactor: simplify SelectTokenWidget cleanup logic and stabilize clos…
fairlighteth Dec 10, 2025
a39b058
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 10, 2025
6ec3aa4
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 10, 2025
bc266f5
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 10, 2025
efd1e52
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 11, 2025
169c56f
refactor(tokensList): replace props drilling with Jotai atom
fairlighteth Dec 11, 2025
03a4115
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 11, 2025
62a7585
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 11, 2025
37d14a5
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 11, 2025
0436f9c
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 11, 2025
0db3787
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 11, 2025
a600182
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 11, 2025
01342a5
refactor(tokensList): move atom hydration to controller, slim modal p…
fairlighteth Dec 11, 2025
8285d30
refactor: memoize hydration values for stable type inference
fairlighteth Dec 11, 2025
5a72cb2
refactor: define concrete tuple type for TypeScript overloads
fairlighteth Dec 11, 2025
8177cbe
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 11, 2025
37756f8
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 11, 2025
e8c20a2
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 11, 2025
1a21e05
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 11, 2025
c57a85f
refactor: bridgingEnabledUpdater to remove feature flag dependency
fairlighteth Dec 11, 2025
262bc27
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 11, 2025
502eb32
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 11, 2025
f5eccb3
Merge branch 'feat/token-selector-13' into feat/token-selector-14
fairlighteth Dec 11, 2025
59271eb
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 11, 2025
6400b65
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 11, 2025
6ad1e2a
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 11, 2025
71e5b70
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 11, 2025
a316ba2
Merge branch 'feat/token-selector-8' into feat/token-selector-9
fairlighteth Dec 11, 2025
de21d1d
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 11, 2025
823bab3
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 11, 2025
ce5d3e6
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 11, 2025
211b4dc
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 11, 2025
0dfdb3f
Merge branch 'feat/token-selector-13' into feat/token-selector-14
fairlighteth Dec 11, 2025
8fff317
Merge branch 'develop' into feat/token-selector-4
fairlighteth Dec 12, 2025
efd2381
refactor: update recent tokens storage constants and improve naming c…
fairlighteth Dec 12, 2025
cd29cc1
refactor: rename recent tokens storage constants for consistency and …
fairlighteth Dec 12, 2025
336ba7d
Merge branch 'feat/token-selector-4' into feat/token-selector-5
fairlighteth Dec 12, 2025
a8306e4
feat: add TODO comment to revisit wallet bridging for advanced trades
fairlighteth Dec 12, 2025
1cdcea7
refactor: simplify width calculation logic in styled component
fairlighteth Dec 12, 2025
1fb7aae
Merge branch 'feat/token-selector-5' into feat/token-selector-6
fairlighteth Dec 12, 2025
7b8d9ba
Merge branch 'feat/token-selector-6' into feat/token-selector-7
fairlighteth Dec 12, 2025
8b380ec
Merge branch 'feat/token-selector-7' into feat/token-selector-8
fairlighteth Dec 12, 2025
32877a5
fix: update aria-hidden attribute in ActiveIcon for accessibility
fairlighteth Dec 12, 2025
def614d
refactor: remove TODO comment regarding 'modules' import in useGetExe…
fairlighteth Dec 12, 2025
f506eb2
Merge remote-tracking branch 'origin/feat/token-selector-8' into feat…
fairlighteth Dec 15, 2025
3884349
Merge branch 'feat/token-selector-9' into feat/token-selector-10
fairlighteth Dec 15, 2025
c3be32a
refactor: remove feature flag dependency from BridgingEnabledUpdater …
fairlighteth Dec 15, 2025
0719aac
Merge branch 'feat/token-selector-10' into feat/token-selector-11
fairlighteth Dec 15, 2025
de3ddef
Merge branch 'feat/token-selector-11' into feat/token-selector-12
fairlighteth Dec 15, 2025
49c2048
Merge branch 'feat/token-selector-12' into feat/token-selector-13
fairlighteth Dec 15, 2025
17e0c06
feat: add TODO comment to revisit chain selection limitations for TWA…
fairlighteth Dec 15, 2025
a8f73a3
Merge branch 'feat/token-selector-13' into feat/token-selector-14
fairlighteth Dec 15, 2025
41a214d
refactor: decompose components and interfaces
limitofzero Jan 5, 2026
70bc2e9
refactor: decompose states/contexts
limitofzero Jan 5, 2026
7ef82ce
refactor: decompose
limitofzero Jan 5, 2026
1bc67b8
refactor: divide widgets
limitofzero Jan 5, 2026
963d812
refactor: migrate to new token selector
limitofzero Jan 5, 2026
4d15d1e
refactor: migrate token lists
limitofzero Jan 6, 2026
1cf059c
refactor: clean up
limitofzero Jan 6, 2026
c37a537
refactor: simplify controllers
limitofzero Jan 6, 2026
5fd3a4c
refactor: move controller
limitofzero Jan 6, 2026
d5132ea
refactor: decompose state
limitofzero Jan 6, 2026
7324f70
refactor: remove unused
limitofzero Jan 6, 2026
928eff4
refactor: rename components
limitofzero Jan 6, 2026
aeca5e0
refactor: create few controllers
limitofzero Jan 6, 2026
f03cb5f
Merge origin/develop into feat/token-selector-15
limitofzero Jan 6, 2026
b33c756
chore: update i18n
limitofzero Jan 6, 2026
ffb8735
refactor: remove atom hydration
limitofzero Jan 6, 2026
ee146ad
fix: build
limitofzero Jan 6, 2026
f4a4629
refactor: decompose view blocking modals
limitofzero Jan 7, 2026
6d8e2f3
refactor: remove unused state
limitofzero Jan 7, 2026
c96984c
refactor: use memo + remove dead code
limitofzero Jan 7, 2026
4945efd
fix: clear button
limitofzero Jan 7, 2026
7c9b470
refactor: divide hooks
limitofzero Jan 9, 2026
20984c7
refactor: decompose files
limitofzero Jan 9, 2026
bd5dcb8
refactor: add proper export comments
limitofzero Jan 9, 2026
c54ff96
refactor: decompose files
limitofzero Jan 9, 2026
7d5dfb5
refactor: decompose more
limitofzero Jan 9, 2026
f216bfc
refactor: add types like system for slots
limitofzero Jan 12, 2026
6d28194
refactor: prepare to integrate consent flow in token selector
limitofzero Jan 12, 2026
a350c5f
feat: add consent flow
limitofzero Jan 12, 2026
dfed529
feat: add correct block flow for new token selector
limitofzero Jan 12, 2026
df9a9b4
refactor: use narrow types for consent flow
limitofzero Jan 12, 2026
87423b1
fix: merge develop
limitofzero Jan 12, 2026
e36ee57
fix: handle consent for token lists
limitofzero Jan 12, 2026
a298abe
refactor: consent flow hooks
limitofzero Jan 12, 2026
989d9e6
refactor: move atoms
limitofzero Jan 13, 2026
9b9f10f
refactor: decompose hooks
limitofzero Jan 13, 2026
dd3e470
refactor: useMemo + remove internal state
limitofzero Jan 13, 2026
a1f7083
refactor: error check
limitofzero Jan 13, 2026
abf4843
refactor: remove unused hooks
limitofzero Jan 13, 2026
ab9b229
refactor: remove unused
limitofzero Jan 13, 2026
999cf49
feat: add typecheck
limitofzero Jan 13, 2026
93aeec2
refactor: typeguards
limitofzero Jan 13, 2026
4b3d94c
chore: use i18n for default titles
limitofzero Jan 13, 2026
f65aa5e
fix: onselect chain close
limitofzero Jan 13, 2026
3799dd5
refactor: titles
limitofzero Jan 13, 2026
1a15cd1
refactor: remove getTokenUniqueKey
limitofzero Jan 13, 2026
68f7ae5
refactor: move helpers
limitofzero Jan 13, 2026
ee0eb78
refactor: decompose hook
limitofzero Jan 13, 2026
79f3fd1
refactor: decompose ChainPanel
limitofzero Jan 13, 2026
8b7dd09
refactor: use getTokenId to compare tokens
limitofzero Jan 13, 2026
016e871
refactor: use helper
limitofzero Jan 13, 2026
db6a0b8
refactor: routes aviability hook
limitofzero Jan 13, 2026
7dad97d
refactor: decompose the hook
limitofzero Jan 13, 2026
7ef562e
refactor: token virtual list
limitofzero Jan 13, 2026
c6cbc42
fix: yield widget
limitofzero Jan 13, 2026
dd371ee
Merge branch 'develop' into feat/token-selector-15
limitofzero Jan 13, 2026
67b4118
fix: build
limitofzero Jan 13, 2026
abae58f
fix: use slice before sort
limitofzero Jan 13, 2026
7c5e9de
Merge branch 'develop' into feat/token-selector-15
limitofzero Jan 14, 2026
e577716
fix: remarks
limitofzero Jan 15, 2026
f7b6264
Merge branch 'feat/token-selector-15' of github.com:cowprotocol/cowsw…
limitofzero Jan 15, 2026
06d36a3
refactor: remove useless hook
limitofzero Jan 15, 2026
1f0f43d
fix: chain panel styles
limitofzero Jan 15, 2026
3345e9b
fix: remove cross icon from token list settings
limitofzero Jan 15, 2026
2f2c6ab
fix: remove network list if it's empty
limitofzero Jan 15, 2026
132d81a
fix: remove unused parameter
limitofzero Jan 15, 2026
25249c7
refactor: add address key type
limitofzero Jan 15, 2026
4ee5e67
refactor: improve types
limitofzero Jan 15, 2026
7044d9b
fix: autoimport
limitofzero Jan 15, 2026
8b7bff0
fix: remove conflict issue
limitofzero Jan 15, 2026
2286f9b
fix: clear pending state
limitofzero Jan 15, 2026
fd70869
refactor: move logic the the hook
limitofzero Jan 15, 2026
69f6109
chore: rename component
limitofzero Jan 15, 2026
ebae510
fix: state
limitofzero Jan 15, 2026
068ac3d
Merge branch 'develop' into feat/token-selector-15
limitofzero Jan 15, 2026
2d38b24
fix: helper for keys
limitofzero Jan 16, 2026
d867a94
fix: address comparison logic + tests
limitofzero Jan 16, 2026
fefadfe
refactor: address key
limitofzero Jan 16, 2026
575054d
refactor: add tests and descr for hook
limitofzero Jan 16, 2026
b253dfb
refactor: useMemo
limitofzero Jan 16, 2026
a99d6f5
refactor: simplify
limitofzero Jan 16, 2026
e182e34
refactor: rename the hook
limitofzero Jan 16, 2026
effda5b
refactor: move logic to updater
limitofzero Jan 16, 2026
0423861
refactor: useMemo
limitofzero Jan 20, 2026
0ddf96b
refactor: useMemo
limitofzero Jan 20, 2026
721f9a5
refactor: rename atoms dirs
limitofzero Jan 20, 2026
31d2e21
fix: merge conflicts
limitofzero Jan 20, 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
1 change: 1 addition & 0 deletions apps/cowswap-frontend/src/entities/bridgeProvider/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
export { useBridgeSupportedNetworks, useBridgeSupportedNetwork } from './useBridgeSupportedNetworks'
export { useBridgeSupportedTokens } from './useBridgeSupportedTokens'
export { useRoutesAvailability } from './useRoutesAvailability'
export { useHasHookBridgeProvidersEnabled } from './useHasHookBridgeProvidersEnabled'
export { BridgeProvidersUpdater } from './BridgeProvidersUpdater'
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import { SupportedChainId } from '@cowprotocol/cow-sdk'

import { bridgingSdk } from 'tradingSdk/bridgingSdk'

export interface RoutesAvailabilityResult {
unavailableChainIds: Set<number>
loadingChainIds: Set<number>
isLoading: boolean
}

export interface RouteCheckResult {
chainId: number
isAvailable: boolean
}

export const EMPTY_ROUTES_RESULT: RoutesAvailabilityResult = {
unavailableChainIds: new Set(),
loadingChainIds: new Set(),
isLoading: false,
}

export function filterDestinationChains(destinationChainIds: number[], sourceChainId: number | undefined): number[] {
return destinationChainIds.filter((id) => id !== sourceChainId)
}

export type RoutesAvailabilityKey = [SupportedChainId, string, string, string]

export interface RoutesAvailabilityKeyParams {
isBridgingEnabled: boolean
sourceChainId: SupportedChainId | undefined
chainsToCheck: number[]
providersKey: string
}

export function createAvailabilitySwrKey(params: RoutesAvailabilityKeyParams): RoutesAvailabilityKey | null {
const { isBridgingEnabled, sourceChainId, chainsToCheck, providersKey } = params

if (!isBridgingEnabled || !sourceChainId || chainsToCheck.length === 0) {
return null
}

return [
sourceChainId,
chainsToCheck
.slice()
.sort((a, b) => a - b)
.join(','),
providersKey,
'routesAvailability',
]
}

export async function fetchRoutesAvailability(key: RoutesAvailabilityKey): Promise<RouteCheckResult[]> {
const [sellChainId, chainIdsString] = key
const chainIds = chainIdsString.split(',').map(Number)

return Promise.all(chainIds.map((buyChainId) => checkSingleRouteAvailability(sellChainId, buyChainId)))
}

async function checkSingleRouteAvailability(
sellChainId: SupportedChainId,
buyChainId: number,
): Promise<RouteCheckResult> {
try {
const result = await bridgingSdk.getBuyTokens({ sellChainId, buyChainId })
const isAvailable = result.tokens.length > 0 && result.isRouteAvailable

return { chainId: buyChainId, isAvailable }
} catch (error) {
console.warn(`[routesAvailability] Failed to check route ${sellChainId} -> ${buyChainId}`, error)

return { chainId: buyChainId, isAvailable: false }
}
}

export interface BuildResultParams {
swrKey: RoutesAvailabilityKey | null
isLoading: boolean
data: RouteCheckResult[] | undefined
chainsToCheck: number[]
}

export function buildRoutesAvailabilityResult(params: BuildResultParams): RoutesAvailabilityResult {
const { swrKey, isLoading, data, chainsToCheck } = params

if (!swrKey) {
return EMPTY_ROUTES_RESULT
}

if (isLoading || !data) {
return {
unavailableChainIds: new Set(),
loadingChainIds: new Set(chainsToCheck),
isLoading: true,
}
}

const unavailableChainIds = new Set<number>(
data.filter((result) => !result.isAvailable).map((result) => result.chainId),
)

return {
unavailableChainIds,
loadingChainIds: new Set(),
isLoading: false,
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
import { useIsBridgingEnabled } from '@cowprotocol/common-hooks'
import { SupportedChainId } from '@cowprotocol/cow-sdk'

import { renderHook, waitFor } from '@testing-library/react'
import { bridgingSdk } from 'tradingSdk/bridgingSdk'

import { useBridgeProvidersIds } from './useBridgeProvidersIds'
import { useRoutesAvailability } from './useRoutesAvailability'

// Mock dependencies
jest.mock('@cowprotocol/common-hooks', () => ({
useIsBridgingEnabled: jest.fn(),
}))

jest.mock('./useBridgeProvidersIds', () => ({
useBridgeProvidersIds: jest.fn(),
}))

jest.mock('tradingSdk/bridgingSdk', () => ({
bridgingSdk: {
getBuyTokens: jest.fn(),
},
}))

const mockUseIsBridgingEnabled = useIsBridgingEnabled as jest.Mock
const mockUseBridgeProvidersIds = useBridgeProvidersIds as jest.Mock
const mockGetBuyTokens = bridgingSdk.getBuyTokens as jest.Mock

let testId = 0

describe('useRoutesAvailability', () => {
beforeEach(() => {
jest.clearAllMocks()
mockUseIsBridgingEnabled.mockReturnValue(true)
// Use unique provider IDs per test to avoid SWR cache conflicts
testId++
mockUseBridgeProvidersIds.mockReturnValue([`provider-${testId}`])
})

it('returns empty result when bridging is disabled', () => {
mockUseIsBridgingEnabled.mockReturnValue(false)

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN]),
)

expect(result.current).toEqual({
unavailableChainIds: new Set(),
loadingChainIds: new Set(),
isLoading: false,
})
})

it('returns empty result when sourceChainId is undefined', () => {
const { result } = renderHook(() => useRoutesAvailability(undefined, [SupportedChainId.GNOSIS_CHAIN]))

expect(result.current).toEqual({
unavailableChainIds: new Set(),
loadingChainIds: new Set(),
isLoading: false,
})
})

it('returns empty result when destinationChainIds is empty', () => {
const { result } = renderHook(() => useRoutesAvailability(SupportedChainId.MAINNET, []))

expect(result.current).toEqual({
unavailableChainIds: new Set(),
loadingChainIds: new Set(),
isLoading: false,
})
})

it('excludes source chain from chains to check', async () => {
mockGetBuyTokens.mockResolvedValue({ tokens: ['token1'], isRouteAvailable: true })

renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [
SupportedChainId.MAINNET, // same as source, should be excluded
SupportedChainId.GNOSIS_CHAIN,
]),
)

await waitFor(() => {
expect(mockGetBuyTokens).toHaveBeenCalledTimes(1)
expect(mockGetBuyTokens).toHaveBeenCalledWith({
sellChainId: SupportedChainId.MAINNET,
buyChainId: SupportedChainId.GNOSIS_CHAIN,
})
})
})

it('marks chains as unavailable when route check fails', async () => {
mockGetBuyTokens.mockRejectedValue(new Error('Network error'))

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN]),
)

await waitFor(() => {
expect(result.current.unavailableChainIds.has(SupportedChainId.GNOSIS_CHAIN)).toBe(true)
expect(result.current.isLoading).toBe(false)
})
})

it('marks chains as unavailable when no tokens available', async () => {
mockGetBuyTokens.mockResolvedValue({ tokens: [], isRouteAvailable: true })

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN]),
)

await waitFor(() => {
expect(result.current.unavailableChainIds.has(SupportedChainId.GNOSIS_CHAIN)).toBe(true)
expect(result.current.isLoading).toBe(false)
})
})

it('marks chains as unavailable when route is not available', async () => {
mockGetBuyTokens.mockResolvedValue({ tokens: ['token1'], isRouteAvailable: false })

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN]),
)

await waitFor(() => {
expect(result.current.unavailableChainIds.has(SupportedChainId.GNOSIS_CHAIN)).toBe(true)
expect(result.current.isLoading).toBe(false)
})
})

it('marks chains as available when route exists', async () => {
mockGetBuyTokens.mockResolvedValue({ tokens: ['token1'], isRouteAvailable: true })

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN]),
)

await waitFor(() => {
expect(result.current.unavailableChainIds.has(SupportedChainId.GNOSIS_CHAIN)).toBe(false)
expect(result.current.isLoading).toBe(false)
})
})

it('checks multiple destination chains in parallel', async () => {
// Mock based on buyChainId parameter
mockGetBuyTokens.mockImplementation(({ buyChainId }) => {
if (buyChainId === SupportedChainId.GNOSIS_CHAIN) {
return Promise.resolve({ tokens: ['token1'], isRouteAvailable: true })
}
return Promise.resolve({ tokens: [], isRouteAvailable: false })
})

const { result } = renderHook(() =>
useRoutesAvailability(SupportedChainId.MAINNET, [SupportedChainId.GNOSIS_CHAIN, SupportedChainId.ARBITRUM_ONE]),
)

await waitFor(() => {
expect(mockGetBuyTokens).toHaveBeenCalledTimes(2)
expect(result.current.unavailableChainIds.has(SupportedChainId.ARBITRUM_ONE)).toBe(true)
expect(result.current.unavailableChainIds.has(SupportedChainId.GNOSIS_CHAIN)).toBe(false)
})
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { useMemo } from 'react'

import { SWR_NO_REFRESH_OPTIONS } from '@cowprotocol/common-const'
import { useIsBridgingEnabled } from '@cowprotocol/common-hooks'
import { SupportedChainId } from '@cowprotocol/cow-sdk'

import useSWR from 'swr'

import {
buildRoutesAvailabilityResult,
createAvailabilitySwrKey,
fetchRoutesAvailability,
filterDestinationChains,
RouteCheckResult,
RoutesAvailabilityKey,
RoutesAvailabilityResult,
} from './routesAvailabilityUtils'
import { useBridgeProvidersIds } from './useBridgeProvidersIds'

export type { RoutesAvailabilityResult } from './routesAvailabilityUtils'

/**
* Pre-checks route availability for multiple destination chains from a source chain.
* Returns which chains have unavailable routes and which are still loading.
*/
export function useRoutesAvailability(
sourceChainId: SupportedChainId | undefined,
destinationChainIds: number[],
): RoutesAvailabilityResult {
const isBridgingEnabled = useIsBridgingEnabled()
const providerIds = useBridgeProvidersIds()
const providersKey = providerIds.join('|')

const chainsToCheck = useMemo(
() => filterDestinationChains(destinationChainIds, sourceChainId),
[destinationChainIds, sourceChainId],
)

const swrKey = useMemo(
() => createAvailabilitySwrKey({ isBridgingEnabled, sourceChainId, chainsToCheck, providersKey }),
[isBridgingEnabled, sourceChainId, chainsToCheck, providersKey],
)

const { data, isLoading } = useSWR<RouteCheckResult[], Error, RoutesAvailabilityKey | null>(
swrKey,
fetchRoutesAvailability,
SWR_NO_REFRESH_OPTIONS,
)

return useMemo(
() => buildRoutesAvailabilityResult({ swrKey, isLoading, data, chainsToCheck }),
[swrKey, isLoading, data, chainsToCheck],
)
}
Loading