Skip to content

Commit a2eef1e

Browse files
ci(release): publish latest release
1 parent fde521e commit a2eef1e

File tree

934 files changed

+39292
-19022
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

934 files changed

+39292
-19022
lines changed

.github/workflows/tag_and_release.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ jobs:
88
deploy-to-prod:
99
runs-on: ubuntu-latest
1010
steps:
11-
- uses: actions/checkout@v3
11+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
1212

1313
- name: 🧷️ Get version
1414
uses: juliangruber/read-file-action@02bbba9876a8f870efd4ad64e3b9088d3fb94d4b
@@ -31,7 +31,7 @@ jobs:
3131
tag_prefix: ""
3232

3333
- name: 🪽 Release
34-
uses: actions/create-release@v1.1.0
34+
uses: actions/create-release@c9ba6969f07ed90fae07e2e66100dd03f9b1a50e
3535
env:
3636
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
3737
with:

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ claude.md
6666
claude.local.md
6767
CLAUDE.md
6868
CLAUDE.local.md
69+
.claude/settings.local.json
6970

7071
# cursor
7172
.cursor/mcp.json
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
diff --git a/src/providers/shared/hooks/useItemLayoutStyles.ts b/src/providers/shared/hooks/useItemLayoutStyles.ts
2+
index a1a77b0d6a096e7881e71827b49825e62de9bdc4..ab4a43340b55458505786cd2b1e1f2b08de790dd 100644
3+
--- a/src/providers/shared/hooks/useItemLayoutStyles.ts
4+
+++ b/src/providers/shared/hooks/useItemLayoutStyles.ts
5+
@@ -12,7 +12,7 @@ import { useCommonValuesContext } from '../CommonValuesProvider';
6+
import useItemZIndex from './useItemZIndex';
7+
8+
const RELATIVE_STYLE: ViewStyle = {
9+
- opacity: 1,
10+
+ left: -9999,
11+
position: 'relative',
12+
transform: [],
13+
zIndex: 0
14+
@@ -20,7 +20,7 @@ const RELATIVE_STYLE: ViewStyle = {
15+
16+
const NO_TRANSLATION_STYLE: ViewStyle = {
17+
...RELATIVE_STYLE,
18+
- opacity: 0,
19+
+ left: -9999,
20+
position: 'absolute',
21+
zIndex: -1
22+
};
23+
@@ -103,7 +103,7 @@ export default function useItemLayoutStyles(
24+
}
25+
26+
return {
27+
- opacity: 1,
28+
+ left: 0,
29+
position: 'absolute',
30+
transform: [
31+
{ translateX: translateX.value },

RELEASE

Lines changed: 91 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
IPFS hash of the deployment:
2-
- CIDv0: `QmS8qrGS67nT1Qt9SQdfLvKpUhmRh3XZDyQCNZVE4WzEQm`
3-
- CIDv1: `bafybeibynbp7iktxacbiaqofl44ckuyo3ioerk6y53xmi3bjmqr44yh4by`
2+
- CIDv0: `QmYHj3rUHGFTPrskT4YbeyXkrmhsrMBKM4KsYVavcLpYW5`
3+
- CIDv1: `bafybeiet2uenzqsau5dmg6yzpcufisgiqzghzndejd7ox4ivnbuzxmyidi`
44

55
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org).
66

@@ -10,14 +10,99 @@ You can also access the Uniswap Interface from an IPFS gateway.
1010
Your Uniswap settings are never remembered across different URLs.
1111

1212
IPFS gateways:
13-
- https://bafybeibynbp7iktxacbiaqofl44ckuyo3ioerk6y53xmi3bjmqr44yh4by.ipfs.dweb.link/
14-
- [ipfs://QmS8qrGS67nT1Qt9SQdfLvKpUhmRh3XZDyQCNZVE4WzEQm/](ipfs://QmS8qrGS67nT1Qt9SQdfLvKpUhmRh3XZDyQCNZVE4WzEQm/)
13+
- https://bafybeiet2uenzqsau5dmg6yzpcufisgiqzghzndejd7ox4ivnbuzxmyidi.ipfs.dweb.link/
14+
- [ipfs://QmYHj3rUHGFTPrskT4YbeyXkrmhsrMBKM4KsYVavcLpYW5/](ipfs://QmYHj3rUHGFTPrskT4YbeyXkrmhsrMBKM4KsYVavcLpYW5/)
1515

16-
### 5.103.4 (2025-07-25)
16+
## 5.104.0 (2025-07-31)
17+
18+
19+
### Features
20+
21+
* **web:** [lp] sort fee tiers by tvl (#21598) 8b6116d
22+
* **web:** abstracted wallet connector hooks (#21168) c4a4198
23+
* **web:** add MultiBlockchainAddressDisplay (#21477) 8f07ba1
24+
* **web:** add svmAccountDetails (#21473) 8ac1623
25+
* **web:** Add TWIT.json (#21871) 3ad0247
26+
* **web:** handle solana disconnect (#21572) 67449d8
27+
* **web:** implement multi-plaftorm connector deduplication util (#21167) 327d7f5
28+
* **web:** implement WalletConnectorMeta utils (#21166) 9f3996d
29+
* **web:** improve redux hydration check saga (#19552) c23dd31
30+
* **web:** jup execute endpoint (#21580) 15b3110
31+
* **web:** jup order endpoint (#21574) 52f03ba
32+
* **web:** prepopulate onramp for moonpay ads (#21834) 2ecbaae
33+
* **web:** replace old WalletConnectorOption with new (#21361) ff1845e
34+
* **web:** solanaSwapSaga (#21581) 6efb6e1
35+
* **web:** use git tag as version (#22063) 8f86019
36+
* **web:** use new WalletConnectorOptions with new hooks (#21389) 8e60136
37+
* **web:** wallet connector option should use WalletConnectorMeta (#21314) bf69053
1738

1839

1940
### Bug Fixes
2041

21-
* **web:** prevent token unwrapping for v4 on the explore page (#22050) 2f9f122
42+
* **web:** [lp] default increase position currency fields (#21728) 1fe477a
43+
* **web:** [lp] dynamic fee in default fee tiers (#21723) 829560e
44+
* **web:** [lp] enable create fee tier with hook (#21727) 68cf2a2
45+
* **web:** [lp] improve positions page performance (#21750) 5e5edc4
46+
* **web:** [lp] reset defaultFeeTierSelected when feeTierData changes (#21612) 113e8f0
47+
* **web:** 07 28 fix web pool fee can be 0 for dynamic pools staging (#22114) ce65c4f
48+
* **web:** add blast API URL to CSP (#21705) 44d0509
49+
* **web:** align version in settings (#21842) 712e9c7
50+
* **web:** catch vite preload errors (#22029) 03935e0
51+
* **web:** eslint rule useAccount fix (#21804) 70d4d05
52+
* **web:** fix blockaid logo size (#21858) ea94fc8
53+
* **web:** fix chart rendering loop (#21913) c99540d
54+
* **web:** fix storybook tests (#19733) fbc8edb
55+
* **web:** fix wallet connection analytics (#21765) 6b905f5
56+
* **web:** handle binance wallet app browser wagmi injected connector (#21900) 55a8ca2
57+
* **web:** mobile browser injected wallet (#22117) 44992f2
58+
* **web:** need to account from to send function (#22217) f424d9c
59+
* **web:** prevent testnet mode from breaking native token logos (#21848) 7f3378f
60+
* **web:** prevent token unwrapping for v4 on the explore page (#22047) b5ac039
61+
* **web:** remove conditional hook calls (#22025) 185f349
62+
* **web:** remove data: from scriptSrc in CSP (#21788) facf675
63+
* **web:** theme settings (#21856) d913334
64+
* **web:** unblock solana explore (#21866) 01785b8
65+
* **web:** Update Order routing popup to show Dynamic instead of flag (#21854) b7a52a3
66+
* **web:** update rendering for mini-p (#21966) 17dfffb
67+
* **web:** update the create position review modal for one sided positions (#21655) fa21880
68+
* **web:** use icon override map for wallet connector icons (#21674) c07d2b2
69+
* **web:** use native token for increase calldata query (#22169) a6fabfc
70+
* **web:** vite smoketest - wait for UI element instead of network idle (#21602) f31d52b
71+
72+
73+
### Continuous Integration
74+
75+
* **web:** update sitemaps c57b17d
76+
77+
78+
### Styles
79+
80+
* **web:** fix hover states on connected wallet and mini-portfolio rail (#21914) 4e4e3e1
81+
* **web:** update tdp description length from 4 to 6 rows (#21875) 7f1b530
82+
83+
84+
### Code Refactoring
85+
86+
* **web:** align types better with Uniswap types by migrating info -> typeInfo (#21498) ba66ce8
87+
* **web:** break wallet connection logging/analytics/ui/state into wrappers around base functionality (#21792) e694ba8
88+
* **web:** decouple evm connector chain ID from popup activity (#21582) a4a8905
89+
* **web:** delete web transaction reducer and update code, types and tests (#21812) 5d71ab0
90+
* **web:** type RPC_PROVIDERS as EVM only (#21850) efabaa4
91+
* **web:** update web's transaction reducer structure to use the same structure as Uniswap's transaction reducer for easier migration, and add migration (#21496) 246c2ac
92+
* **web:** use usePortfolioBalances to fetch token data from gql or rest (#21971) 0a274e0
93+
94+
95+
### Tests
96+
97+
* **web:** [lp] create - custom fee tier (#21670) 6a31f2b
98+
* **web:** [lp] generateCreateCalldataQueryParams and generateAddLiquidityApprovalParams (#21863) da7d009
99+
* **web:** [lp] generateCreatePositionTxRequest (#21865) 811c197
100+
* **web:** [lp] migrate v3 e2e (#21654) 532a7cf
101+
* **web:** [lp] unit tests for getDependentAmountFromV2Pair, getDependentAmountFromV3Position, getDependentAmountFromV4Position (#21868) ca98497
102+
* **web:** [lp] unit tests for useDepositInfo (#21885) 6c3ef5c
103+
* **web:** fix a few e2e tests (#22076) ae30666
104+
* **web:** fix formatting for expected ETH balance after successful swap (#21698) c4935e0
105+
* **web:** fix Swap Settings test id (#21658) 40abac2
106+
* **web:** fix swap test for detecting ERC20 balance (#21697) 2f9b3dd
22107

23108

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
web/5.103.4
1+
web/5.104.0

apps/extension/src/app/context/SmartWalletNudgesContext.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
import { useAccountCountChanged } from 'wallet/src/features/wallet/hooks'
1515

1616
import { extractUrlHost } from 'utilities/src/format/urls'
17+
import { ONE_DAY_MS } from 'utilities/src/time/time'
1718
import {
1819
SmartWalletDelegationAction,
1920
useSmartWalletDelegationStatus,
@@ -62,9 +63,20 @@ export function SmartWalletNudgesProvider({ children }: { children: ReactNode })
6263
? selectHasShownEip5792Nudge(state, last5792DappInfo.activeConnectedAddress, last5792DappInfo.url)
6364
: false,
6465
)
66+
// Check if home screen nudge was recently shown (24 hour cooldown)
67+
const lastHomeScreenShown = useSelector((state: WalletState) =>
68+
last5792DappInfo
69+
? state.behaviorHistory.smartWalletNudge?.[last5792DappInfo.activeConnectedAddress]?.lastHomeScreenNudgeShown
70+
: undefined,
71+
)
72+
73+
const hasRecentHomeScreenShown = lastHomeScreenShown ? Date.now() - lastHomeScreenShown < ONE_DAY_MS : false
6574

6675
const shouldShowNudge =
67-
!hasShownNudge && delegationStatus.status === SmartWalletDelegationAction.PromptUpgrade && !delegationStatus.loading
76+
!hasShownNudge &&
77+
!hasRecentHomeScreenShown &&
78+
delegationStatus.status === SmartWalletDelegationAction.PromptUpgrade &&
79+
!delegationStatus.loading
6880

6981
useEffect(() => {
7082
if (last5792DappInfo && shouldShowNudge) {

apps/extension/src/app/features/accounts/AccountSwitcherScreen.tsx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ export function AccountSwitcherScreen(): JSX.Element {
7070
// TODO: EXT-899 https://linear.app/uniswap/issue/EXT-899/enable-unitag-edit-button-is-account-header
7171
const activeAccountDisplayName = useDisplayName(activeAddress)
7272
const activeAccountHasUnitag = activeAccountDisplayName?.type === DisplayNameType.Unitag
73+
const activeAccountHasENS = activeAccountDisplayName?.type === DisplayNameType.ENS
7374

7475
const [showEditLabelModal, setShowEditLabelModal] = useState(false)
7576

@@ -245,6 +246,7 @@ export function AccountSwitcherScreen(): JSX.Element {
245246
menuOptions={menuOptions}
246247
placement="bottom"
247248
onLeftClick
249+
menuContainerStyleProps={{ mr: '$spacing12' }}
248250
>
249251
<TouchableArea
250252
borderRadius="$roundedFull"
@@ -274,20 +276,22 @@ export function AccountSwitcherScreen(): JSX.Element {
274276
</Flex>
275277
</Flex>
276278

277-
<Flex pt="$padding16">
279+
<Flex pt={activeAccountHasENS ? undefined : '$padding16'}>
278280
{activeAccountHasUnitag ? (
279281
<UnitagActionButton />
280282
) : (
281-
<Flex row>
282-
<Button
283-
size="small"
284-
testID={TestID.AccountCard}
285-
emphasis="secondary"
286-
onPress={() => setShowEditLabelModal(true)}
287-
>
288-
{t('account.wallet.header.button.title')}
289-
</Button>
290-
</Flex>
283+
!activeAccountHasENS && (
284+
<Flex row>
285+
<Button
286+
size="small"
287+
testID={TestID.AccountCard}
288+
emphasis="secondary"
289+
onPress={() => setShowEditLabelModal(true)}
290+
>
291+
{t('account.wallet.header.button.title')}
292+
</Button>
293+
</Flex>
294+
)
291295
)}
292296
</Flex>
293297
</Flex>

apps/extension/src/app/features/dapp/utils.test.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {
2-
getActiveConnectedAccount,
2+
getActiveSignerConnectedAccount,
33
getCapitalizedDisplayNameFromTab,
44
getOrderedConnectedAddresses,
55
isConnectedAccount,
@@ -8,7 +8,7 @@ import { SAMPLE_SEED_ADDRESS_1, SAMPLE_SEED_ADDRESS_2, SAMPLE_SEED_ADDRESS_3 } f
88
import { extractNameFromUrl } from 'utilities/src/format/extractNameFromUrl'
99
import { promiseTimeout } from 'utilities/src/time/timing'
1010
import { Account } from 'wallet/src/features/wallet/accounts/types'
11-
import { ACCOUNT, ACCOUNT2, ACCOUNT3 } from 'wallet/src/test/fixtures'
11+
import { ACCOUNT, ACCOUNT2, ACCOUNT3, readOnlyAccount } from 'wallet/src/test/fixtures'
1212

1313
jest.mock('utilities/src/format/extractNameFromUrl', () => ({
1414
extractNameFromUrl: jest.fn(),
@@ -48,14 +48,22 @@ describe('getActiveConnectedAccount', () => {
4848
const accounts: Account[] = [ACCOUNT, ACCOUNT2]
4949

5050
it('returns the account for the given address', () => {
51-
const result = getActiveConnectedAccount(accounts, SAMPLE_SEED_ADDRESS_2)
51+
const result = getActiveSignerConnectedAccount(accounts, SAMPLE_SEED_ADDRESS_2)
5252
expect(result).toEqual(ACCOUNT2)
5353
})
5454

5555
it('throws an error if the address is not in the list', () => {
5656
expect(() => {
57-
getActiveConnectedAccount(accounts, SAMPLE_SEED_ADDRESS_3)
58-
}).toThrow('The activeConnectedAddress must be in the list of connectedAccounts.')
57+
getActiveSignerConnectedAccount(accounts, SAMPLE_SEED_ADDRESS_3)
58+
}).toThrow('The active connected address must be in the list of connected accounts.')
59+
})
60+
61+
it('throws an error if the account is not a signer mnemonic account', () => {
62+
const readOnlyAccount1 = readOnlyAccount()
63+
const accounts: Account[] = [ACCOUNT, ACCOUNT2, readOnlyAccount1]
64+
expect(() => {
65+
getActiveSignerConnectedAccount(accounts, readOnlyAccount1.address!)
66+
}).toThrow('The active connected address must be a signer mnemonic account.')
5967
})
6068
})
6169

apps/extension/src/app/features/dapp/utils.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { AccountType } from 'uniswap/src/features/accounts/types'
12
import { extractNameFromUrl } from 'utilities/src/format/extractNameFromUrl'
23
import { bubbleToTop } from 'utilities/src/primitives/array'
34
import { ONE_SECOND_MS } from 'utilities/src/time/time'
45
import { promiseTimeout } from 'utilities/src/time/timing'
5-
import { Account } from 'wallet/src/features/wallet/accounts/types'
6+
import { Account, SignerMnemonicAccount } from 'wallet/src/features/wallet/accounts/types'
67

78
const MAX_TAB_QUERY_TIME = ONE_SECOND_MS
89

@@ -11,10 +12,22 @@ export function isConnectedAccount(connectedAccounts: Account[], address: Addres
1112
}
1213

1314
/** Gets the Account for a specific address. The address param must be in the list of connectedAccounts. */
14-
export function getActiveConnectedAccount(connectedAccounts: Account[], activeConnectedAddress: Address): Account {
15+
function getActiveConnectedAccount(connectedAccounts: Account[], activeConnectedAddress: Address): Account {
1516
const activeConnectedAccount = connectedAccounts.find((account) => account.address === activeConnectedAddress)
1617
if (!activeConnectedAccount) {
17-
throw new Error('The activeConnectedAddress must be in the list of connectedAccounts.')
18+
throw new Error('The active connected address must be in the list of connected accounts.')
19+
}
20+
return activeConnectedAccount
21+
}
22+
23+
/** Gets the SignerMnemonicAccount for a specific address. The address param must be in the list of connectedAccounts. */
24+
export function getActiveSignerConnectedAccount(
25+
connectedAccounts: Account[],
26+
activeConnectedAddress: Address,
27+
): SignerMnemonicAccount {
28+
const activeConnectedAccount = getActiveConnectedAccount(connectedAccounts, activeConnectedAddress)
29+
if (activeConnectedAccount.type !== AccountType.SignerMnemonic) {
30+
throw new Error('The active connected address must be a signer mnemonic account.')
1831
}
1932
return activeConnectedAccount
2033
}

apps/extension/src/app/features/dappRequests/DappRequestContent.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { PropsWithChildren } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import { Animated } from 'react-native'
4+
import { useDispatch } from 'react-redux'
45
import { useDappLastChainId } from 'src/app/features/dapp/hooks'
56
import { useDappRequestQueueContext } from 'src/app/features/dappRequests/DappRequestQueueContext'
7+
import { handleExternallySubmittedUniswapXOrder } from 'src/app/features/dappRequests/handleUniswapX'
68
import { useIsDappRequestConfirming } from 'src/app/features/dappRequests/hooks'
79
import { DappRequestStoreItem } from 'src/app/features/dappRequests/shared'
810
import {
@@ -195,6 +197,7 @@ function DappRequestFooter({
195197
disableConfirm,
196198
}: DappRequestFooterProps): JSX.Element {
197199
const { t } = useTranslation()
200+
const dispatch = useDispatch()
198201
const activeAccount = useActiveAccountWithThrow()
199202
const { defaultChainId } = useEnabledChains()
200203
const {
@@ -242,6 +245,9 @@ function DappRequestFooter({
242245
onConfirm()
243246
} else {
244247
await defaultOnConfirm(request)
248+
if (isUniswapX) {
249+
await handleExternallySubmittedUniswapXOrder(activeAccount.address, dispatch)
250+
}
245251
}
246252

247253
if (maybeCloseOnConfirm && shouldCloseSidebar) {

0 commit comments

Comments
 (0)