Skip to content

Commit 1814586

Browse files
authored
Merge branch 'Uniswap:main' into main
2 parents 23f2f76 + be21e48 commit 1814586

728 files changed

Lines changed: 35148 additions & 28095 deletions

File tree

Some content is hidden

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

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ dist/out-tsc/*
4242

4343
# Locale backup/generated files
4444
packages/uniswap/src/i18n/locales/source/*_old.json
45-
packages/uniswap/src/i18n/locales/@types/resources.d.ts
4645

4746
# ci
4847
.ci-cache/

RELEASE

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1-
### We’re back with an exciting release! Here’s the latest
2-
3-
### Unichain Testnet Support
4-
5-
Unichain is a new DeFi-native Ethereum L2, built to be the home for liquidity across chains. We now support its testnet, **Unichain Sepolia**!
6-
7-
### Testnet Mode
8-
9-
Now, developers can use the Uniswap Wallet to transact on testnets and store testnet assets. Currently, we support **ETH Sepolia** and **Unichain Sepolia**.
10-
11-
### Other Changes
12-
13-
- Improved visuals around the networks we support
14-
- Better linkouts on transaction details sheet
15-
- Various bug fixes and performance improvements
1+
### Lots of new updates!
2+
3+
### Bridging
4+
5+
You can now swap your ETH, USDC, and more across 8+ networks! Try it by pressing the banner on your homepage.
6+
7+
### Claim usernames
8+
9+
You can now claim a free uni.eth for your wallet address, a readable username that makess it easy to identify your wallet and receive crypto.
10+
11+
### Multichain Explore
12+
13+
Users can now see all 12 chains we support on the Explore page, and can also filter by a specific chain.
14+
15+
### Worldchain
16+
17+
Users now have access to all ur regular features for this new chain.
18+
19+
### Other changes:
20+
21+
- Various bug fixes and performance improvements

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
extension/1.7.0
1+
extension/1.8.0

apps/extension/.eslintrc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module.exports = {
1212
'manifest.json',
1313
],
1414
parserOptions: {
15-
project: 'tsconfig.json',
15+
project: 'tsconfig.eslint.json',
1616
tsconfigRootDir: __dirname,
1717
ecmaFeatures: {
1818
jsx: true,

apps/extension/package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
"browserslist": "last 2 chrome versions",
55
"dependencies": {
66
"@apollo/client": "3.10.4",
7+
"@datadog/browser-rum": "5.23.3",
78
"@ethersproject/providers": "5.7.2",
89
"@metamask/rpc-errors": "6.2.1",
910
"@reduxjs/toolkit": "1.9.3",
@@ -13,11 +14,11 @@
1314
"@svgr/webpack": "8.0.1",
1415
"@tamagui/core": "1.108.4",
1516
"@types/uuid": "9.0.1",
16-
"@uniswap/analytics-events": "2.37.0",
17+
"@uniswap/analytics-events": "2.38.0",
1718
"@uniswap/uniswapx-sdk": "^2.1.0-beta.14",
18-
"@uniswap/universal-router-sdk": "4.2.0",
19-
"@uniswap/v3-sdk": "3.17.0",
20-
"@uniswap/v4-sdk": "1.10.0",
19+
"@uniswap/universal-router-sdk": "4.5.2",
20+
"@uniswap/v3-sdk": "3.18.1",
21+
"@uniswap/v4-sdk": "1.10.3",
2122
"dotenv-webpack": "8.0.1",
2223
"ethers": "5.7.2",
2324
"eventemitter3": "5.0.1",

apps/extension/src/app/OnboardingApp.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ScanToOnboard } from 'src/app/features/onboarding/scan/ScanToOnboard'
3434
import { ScantasticContextProvider } from 'src/app/features/onboarding/scan/ScantasticContextProvider'
3535
import { OnboardingRoutes, TopLevelRoutes } from 'src/app/navigation/constants'
3636
import { setRouter, setRouterState } from 'src/app/navigation/state'
37-
import { sentryCreateHashRouter } from 'src/app/sentry'
37+
import { SentryAppNameTag, sentryCreateHashRouter } from 'src/app/sentry'
3838
import { initExtensionAnalytics } from 'src/app/utils/analytics'
3939
import { checksIfSupportsSidePanel } from 'src/app/utils/chrome'
4040
import { PrimaryAppInstanceDebuggerLazy } from 'src/store/PrimaryAppInstanceDebuggerLazy'
@@ -56,14 +56,6 @@ const unsupportedRoute: RouteObject = {
5656
element: <UnsupportedBrowserScreen />,
5757
}
5858

59-
const createSteps = {
60-
[CreateOnboardingSteps.Password]: <PasswordCreate />,
61-
[CreateOnboardingSteps.ViewMnemonic]: <ViewMnemonic />,
62-
[CreateOnboardingSteps.TestMnemonic]: <TestMnemonic />,
63-
[CreateOnboardingSteps.Naming]: <NameWallet />,
64-
[CreateOnboardingSteps.Complete]: <Complete flow={ExtensionOnboardingFlow.New} />,
65-
}
66-
6759
const allRoutes = [
6860
{
6961
path: '',
@@ -75,7 +67,18 @@ const allRoutes = [
7567
},
7668
{
7769
path: OnboardingRoutes.Create,
78-
element: <OnboardingStepsProvider key={OnboardingRoutes.Create} steps={createSteps} />,
70+
element: (
71+
<OnboardingStepsProvider
72+
key={OnboardingRoutes.Create}
73+
steps={{
74+
[CreateOnboardingSteps.Password]: <PasswordCreate />,
75+
[CreateOnboardingSteps.ViewMnemonic]: <ViewMnemonic />,
76+
[CreateOnboardingSteps.TestMnemonic]: <TestMnemonic />,
77+
[CreateOnboardingSteps.Naming]: <NameWallet />,
78+
[CreateOnboardingSteps.Complete]: <Complete flow={ExtensionOnboardingFlow.New} />,
79+
}}
80+
/>
81+
),
7982
},
8083
{
8184
path: OnboardingRoutes.Claim,
@@ -84,7 +87,10 @@ const allRoutes = [
8487
key={OnboardingRoutes.Claim}
8588
steps={{
8689
[CreateOnboardingSteps.ClaimUnitag]: <ClaimUnitagScreen />,
87-
...createSteps,
90+
[CreateOnboardingSteps.Password]: <PasswordCreate />,
91+
[CreateOnboardingSteps.ViewMnemonic]: <ViewMnemonic />,
92+
[CreateOnboardingSteps.TestMnemonic]: <TestMnemonic />,
93+
[CreateOnboardingSteps.Complete]: <Complete tryToClaimUnitag flow={ExtensionOnboardingFlow.New} />,
8894
}}
8995
/>
9096
),
@@ -181,7 +187,7 @@ export default function OnboardingApp(): JSX.Element {
181187
return (
182188
<Trace>
183189
<PersistGate persistor={getReduxPersistor()}>
184-
<ExtensionStatsigProvider>
190+
<ExtensionStatsigProvider appName={SentryAppNameTag.Onboarding}>
185191
<I18nextProvider i18n={i18n}>
186192
<SharedWalletProvider reduxStore={getReduxStore()}>
187193
<ErrorBoundary>

apps/extension/src/app/PopupApp.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import { TraceUserProperties } from 'src/app/components/Trace/TraceUserPropertie
1313
import { DappContextProvider } from 'src/app/features/dapp/DappContext'
1414
import { SentryAppNameTag, initializeSentry, sentryCreateHashRouter } from 'src/app/sentry'
1515
import { initExtensionAnalytics } from 'src/app/utils/analytics'
16-
import { getLocalUserId } from 'src/app/utils/storage'
1716
import { getReduxPersistor, getReduxStore } from 'src/store/store'
1817
import { Button, Flex, Image, Text } from 'ui/src'
1918
import { CHROME_LOGO, UNISWAP_LOGO } from 'ui/src/assets'
@@ -25,18 +24,19 @@ import { ElementName } from 'uniswap/src/features/telemetry/constants'
2524
import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context'
2625
import i18n from 'uniswap/src/i18n/i18n'
2726
import { ExtensionScreens } from 'uniswap/src/types/screens/extension'
27+
import { getUniqueId } from 'utilities/src/device/getUniqueId'
2828
import { logger } from 'utilities/src/logger/logger'
2929
import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary'
3030
import { useTestnetModeForLoggingAndAnalytics } from 'wallet/src/features/testnetMode/hooks'
3131
import { SharedWalletProvider } from 'wallet/src/providers/SharedWalletProvider'
3232

33-
getLocalUserId()
33+
getUniqueId()
3434
.then((userId) => {
3535
initializeSentry(SentryAppNameTag.Popup, userId)
3636
})
3737
.catch((error) => {
3838
logger.error(error, {
39-
tags: { file: 'PopupApp.tsx', function: 'getLocalUserId' },
39+
tags: { file: 'PopupApp.tsx', function: 'getUniqueId' },
4040
})
4141
})
4242

@@ -127,7 +127,7 @@ export default function PopupApp(): JSX.Element {
127127
return (
128128
<Trace>
129129
<PersistGate persistor={getReduxPersistor()}>
130-
<ExtensionStatsigProvider>
130+
<ExtensionStatsigProvider appName={SentryAppNameTag.Popup}>
131131
<I18nextProvider i18n={i18n}>
132132
<SharedWalletProvider reduxStore={getReduxStore()}>
133133
<ErrorBoundary>

apps/extension/src/app/SidebarApp.tsx

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ import { MainContent, WebNavigation } from 'src/app/navigation/navigation'
3131
import { setRouter, setRouterState } from 'src/app/navigation/state'
3232
import { SentryAppNameTag, initializeSentry, sentryCreateHashRouter } from 'src/app/sentry'
3333
import { initExtensionAnalytics } from 'src/app/utils/analytics'
34-
import { getLocalUserId } from 'src/app/utils/storage'
3534
import {
3635
DappBackgroundPortChannel,
36+
backgroundToSidePanelMessageChannel,
3737
createBackgroundToSidePanelMessagePort,
3838
} from 'src/background/messagePassing/messageChannels'
3939
import { BackgroundToSidePanelRequestType } from 'src/background/messagePassing/types/requests'
@@ -44,8 +44,9 @@ import { syncAppWithDeviceLanguage } from 'uniswap/src/features/settings/slice'
4444
import Trace from 'uniswap/src/features/telemetry/Trace'
4545
import { ExtensionEventName } from 'uniswap/src/features/telemetry/constants'
4646
import { sendAnalyticsEvent } from 'uniswap/src/features/telemetry/send'
47-
import { UnitagUpdaterContextProvider } from 'uniswap/src/features/unitags/context'
47+
import { UnitagUpdaterContextProvider, useUnitagUpdater } from 'uniswap/src/features/unitags/context'
4848
import i18n from 'uniswap/src/i18n/i18n'
49+
import { getUniqueId } from 'utilities/src/device/getUniqueId'
4950
import { isDevEnv } from 'utilities/src/environment/env'
5051
import { logger } from 'utilities/src/logger/logger'
5152
import { ONE_SECOND_MS } from 'utilities/src/time/time'
@@ -54,13 +55,13 @@ import { ErrorBoundary } from 'wallet/src/components/ErrorBoundary/ErrorBoundary
5455
import { useTestnetModeForLoggingAndAnalytics } from 'wallet/src/features/testnetMode/hooks'
5556
import { SharedWalletProvider } from 'wallet/src/providers/SharedWalletProvider'
5657

57-
getLocalUserId()
58+
getUniqueId()
5859
.then((userId) => {
5960
initializeSentry(SentryAppNameTag.Sidebar, userId)
6061
})
6162
.catch((error) => {
6263
logger.error(error, {
63-
tags: { file: 'SidebarApp.tsx', function: 'getLocalUserId' },
64+
tags: { file: 'SidebarApp.tsx', function: 'getUniqueId' },
6465
})
6566
})
6667

@@ -205,10 +206,21 @@ function SidebarWrapper(): JSX.Element {
205206
useDappRequestPortListener()
206207
useTestnetModeForLoggingAndAnalytics()
207208

209+
const { triggerRefetchUnitags } = useUnitagUpdater()
210+
208211
useEffect(() => {
209212
dispatch(syncAppWithDeviceLanguage())
210213
}, [dispatch])
211214

215+
useEffect(() => {
216+
return backgroundToSidePanelMessageChannel.addMessageListener(
217+
BackgroundToSidePanelRequestType.RefreshUnitags,
218+
() => {
219+
triggerRefetchUnitags()
220+
},
221+
)
222+
}, [triggerRefetchUnitags])
223+
212224
return (
213225
<>
214226
<WebNavigation />
@@ -245,7 +257,7 @@ export default function SidebarApp(): JSX.Element {
245257
return (
246258
<Trace>
247259
<PersistGate persistor={getReduxPersistor()}>
248-
<ExtensionStatsigProvider>
260+
<ExtensionStatsigProvider appName={SentryAppNameTag.Sidebar}>
249261
<I18nextProvider i18n={i18n}>
250262
<SharedWalletProvider reduxStore={getReduxStore()}>
251263
<ErrorBoundary>

apps/extension/src/app/StatsigProvider.tsx

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,45 @@
1-
import { getLocalUserId } from 'src/app/utils/storage'
1+
import { useEffect, useState } from 'react'
2+
import { initializeDatadog } from 'src/app/datadog'
23
import { getStatsigEnvironmentTier } from 'src/app/version'
34
import Statsig from 'statsig-js' // Use JS package for browser
45
import { uniswapUrls } from 'uniswap/src/constants/urls'
56
import { DUMMY_STATSIG_SDK_KEY, StatsigCustomAppValue } from 'uniswap/src/features/gating/constants'
67
import { StatsigOptions, StatsigProvider, StatsigUser } from 'uniswap/src/features/gating/sdk/statsig'
8+
import { getUniqueId } from 'utilities/src/device/getUniqueId'
79
import { useAsyncData } from 'utilities/src/react/hooks'
810

911
async function getStatsigUser(): Promise<StatsigUser> {
1012
return {
11-
userID: await getLocalUserId(),
13+
userID: await getUniqueId(),
1214
appVersion: process.env.VERSION,
1315
custom: {
1416
app: StatsigCustomAppValue.Extension,
1517
},
1618
}
1719
}
1820

19-
export function ExtensionStatsigProvider({ children }: { children: React.ReactNode }): JSX.Element {
20-
const { data: user } = useAsyncData(getStatsigUser)
21-
22-
const nonNullUser: StatsigUser = user ?? {
21+
export function ExtensionStatsigProvider({
22+
children,
23+
appName,
24+
}: {
25+
children: React.ReactNode
26+
appName: string
27+
}): JSX.Element {
28+
const { data: storedUser } = useAsyncData(getStatsigUser)
29+
const [user, setUser] = useState<StatsigUser>({
2330
userID: undefined,
2431
custom: {
2532
app: StatsigCustomAppValue.Extension,
2633
},
2734
appVersion: process.env.VERSION,
28-
}
35+
})
36+
const [initFinished, setInitFinished] = useState(false)
37+
38+
useEffect(() => {
39+
if (storedUser && initFinished) {
40+
setUser(storedUser)
41+
}
42+
}, [storedUser, initFinished])
2943

3044
const options: StatsigOptions = {
3145
environment: {
@@ -34,10 +48,14 @@ export function ExtensionStatsigProvider({ children }: { children: React.ReactNo
3448
api: uniswapUrls.statsigProxyUrl,
3549
disableAutoMetricsLogging: true,
3650
disableErrorLogging: true,
51+
initCompletionCallback: () => {
52+
setInitFinished(true)
53+
initializeDatadog(appName).catch(() => undefined)
54+
},
3755
}
3856

3957
return (
40-
<StatsigProvider options={options} sdkKey={DUMMY_STATSIG_SDK_KEY} user={nonNullUser} waitForInitialization={false}>
58+
<StatsigProvider options={options} sdkKey={DUMMY_STATSIG_SDK_KEY} user={user} waitForInitialization={false}>
4159
{children}
4260
</StatsigProvider>
4361
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { render } from '@testing-library/react'
2+
import UnitagClaimApp from 'src/app/UnitagClaimApp'
3+
import { initializeReduxStore } from 'src/store/store'
4+
5+
describe('UnitagClaimApp', () => {
6+
it('renders without error', async () => {
7+
await initializeReduxStore()
8+
render(<UnitagClaimApp />)
9+
})
10+
})

0 commit comments

Comments
 (0)