Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
interface
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
LuckySwap
interface
Commits
afb0d138
Commit
afb0d138
authored
Jun 16, 2025
by
Uniswap Labs Service Account
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ci(release): publish latest release
parent
91d554d4
Changes
24
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
219 additions
and
142 deletions
+219
-142
RELEASE
RELEASE
+2
-1
VERSION
VERSION
+1
-1
package.json
apps/extension/package.json
+1
-0
HomeScreen.tsx
apps/extension/src/app/features/home/HomeScreen.tsx
+8
-7
PortfolioActionButtons.tsx
...xtension/src/app/features/home/PortfolioActionButtons.tsx
+1
-8
manifest.json
apps/extension/src/manifest.json
+1
-1
build.gradle
apps/mobile/android/app/build.gradle
+3
-3
babel.config.js
apps/mobile/babel.config.js
+11
-10
project.pbxproj
apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj
+24
-24
checkBundleSize.sh
apps/mobile/scripts/checkBundleSize.sh
+1
-1
batchedTransactionSaga.ts
...bile/src/features/walletConnect/batchedTransactionSaga.ts
+3
-1
HomeScreen.tsx
apps/mobile/src/screens/HomeScreen/HomeScreen.tsx
+1
-1
SelectWalletScreen.tsx
apps/mobile/src/screens/Import/SelectWalletScreen.tsx
+73
-30
SettingsFiatCurrencyModal.tsx
apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx
+6
-2
WarningModal.tsx
...iswap/src/components/modals/WarningModal/WarningModal.tsx
+6
-4
urls.ts
packages/uniswap/src/constants/urls.ts
+0
-1
useIsChromeWindowFocused.ts
packages/uniswap/src/extension/useIsChromeWindowFocused.ts
+25
-31
flags.ts
packages/uniswap/src/features/gating/flags.ts
+2
-2
NetworkCostBanner.tsx
...wap/src/features/smartWallet/banner/NetworkCostBanner.tsx
+1
-3
TokenWarningModal.tsx
packages/uniswap/src/features/tokens/TokenWarningModal.tsx
+13
-1
NetworkFeeWarning.tsx
...ap/src/features/transactions/modals/NetworkFeeWarning.tsx
+7
-5
SwapFormTooltips.tsx
...form/SwapFormScreen/SwapFormTooltips/SwapFormTooltips.tsx
+1
-1
SmartWalletModal.tsx
...llet/src/features/smartWallet/modals/SmartWalletModal.tsx
+3
-2
yarn.lock
yarn.lock
+25
-2
No files found.
RELEASE
View file @
afb0d138
...
@@ -2,5 +2,6 @@ We are back with a large update: Smart wallets are here! Enable smart wallets fr
...
@@ -2,5 +2,6 @@ We are back with a large update: Smart wallets are here! Enable smart wallets fr
Other changes:
Other changes:
- When connected to Uniswap Web, you’ll see a new verification check mark so that you know you’re on the right website.
- Users can now enjoy multi-account signing, as well as 1 click Auth support, when connecting to external dapps via WalletConnect
- When connecting to external dapps, users can benefit from better malicious dapp detection.
- Various bug fixes and performance improvements
- Various bug fixes and performance improvements
\ No newline at end of file
VERSION
View file @
afb0d138
extension/1.22.2
mobile/1.52.2
\ No newline at end of file
\ No newline at end of file
apps/extension/package.json
View file @
afb0d138
...
@@ -35,6 +35,7 @@
...
@@ -35,6 +35,7 @@
"react-native-reanimated"
:
"3.16.7"
,
"react-native-reanimated"
:
"3.16.7"
,
"react-native-svg"
:
"15.10.1"
,
"react-native-svg"
:
"15.10.1"
,
"react-native-web"
:
"0.19.13"
,
"react-native-web"
:
"0.19.13"
,
"react-player"
:
"2.16.0"
,
"react-qr-code"
:
"2.0.12"
,
"react-qr-code"
:
"2.0.12"
,
"react-redux"
:
"8.0.5"
,
"react-redux"
:
"8.0.5"
,
"react-router-dom"
:
"6.10.0"
,
"react-router-dom"
:
"6.10.0"
,
...
...
apps/extension/src/app/features/home/HomeScreen.tsx
View file @
afb0d138
...
@@ -2,6 +2,7 @@ import { useApolloClient } from '@apollo/client'
...
@@ -2,6 +2,7 @@ import { useApolloClient } from '@apollo/client'
import
{
SharedEventName
}
from
'
@uniswap/analytics-events
'
import
{
SharedEventName
}
from
'
@uniswap/analytics-events
'
import
{
memo
,
useCallback
,
useEffect
,
useState
}
from
'
react
'
import
{
memo
,
useCallback
,
useEffect
,
useState
}
from
'
react
'
import
{
useTranslation
}
from
'
react-i18next
'
import
{
useTranslation
}
from
'
react-i18next
'
import
ReactPlayer
from
'
react-player
'
import
{
useDispatch
,
useSelector
}
from
'
react-redux
'
import
{
useDispatch
,
useSelector
}
from
'
react-redux
'
import
{
ActivityTab
}
from
'
src/app/components/tabs/ActivityTab
'
import
{
ActivityTab
}
from
'
src/app/components/tabs/ActivityTab
'
import
{
NftsTab
}
from
'
src/app/components/tabs/NftsTab
'
import
{
NftsTab
}
from
'
src/app/components/tabs/NftsTab
'
...
@@ -43,19 +44,19 @@ import { setSmartWalletConsent } from 'wallet/src/features/wallet/slice'
...
@@ -43,19 +44,19 @@ import { setSmartWalletConsent } from 'wallet/src/features/wallet/slice'
const
MemoizedVideo
=
memo
(()
=>
(
const
MemoizedVideo
=
memo
(()
=>
(
<
Flex
borderRadius=
"$rounded12"
overflow=
"hidden"
height=
"auto"
maxWidth=
"100%"
aspectRatio=
"16 / 9"
>
<
Flex
borderRadius=
"$rounded12"
overflow=
"hidden"
height=
"auto"
maxWidth=
"100%"
aspectRatio=
"16 / 9"
>
<
video
<
ReactPlayer
src=
{
SMART_WALLET_UPGRADE_VIDEO
}
url=
{
SMART_WALLET_UPGRADE_VIDEO
}
width=
"100%"
height=
"100%"
playing=
{
true
}
muted=
{
true
}
style=
{
{
style=
{
{
width
:
'
100%
'
,
height
:
'
100%
'
,
objectFit
:
'
cover
'
,
objectFit
:
'
cover
'
,
}
}
}
}
autoPlay
fallback=
{
undefined
}
muted
/>
/>
</
Flex
>
</
Flex
>
))
))
MemoizedVideo
.
displayName
=
'
MemoizedVideo
'
MemoizedVideo
.
displayName
=
'
MemoizedVideo
'
export
const
HomeScreen
=
memo
(
function
_HomeScreen
():
JSX
.
Element
{
export
const
HomeScreen
=
memo
(
function
_HomeScreen
():
JSX
.
Element
{
...
...
apps/extension/src/app/features/home/PortfolioActionButtons.tsx
View file @
afb0d138
...
@@ -7,8 +7,6 @@ import { navigate } from 'src/app/navigation/state'
...
@@ -7,8 +7,6 @@ import { navigate } from 'src/app/navigation/state'
import
{
Flex
,
Text
,
getTokenValue
,
useMedia
}
from
'
ui/src
'
import
{
Flex
,
Text
,
getTokenValue
,
useMedia
}
from
'
ui/src
'
import
{
ArrowDownCircle
,
Bank
,
CoinConvert
,
SendAction
}
from
'
ui/src/components/icons
'
import
{
ArrowDownCircle
,
Bank
,
CoinConvert
,
SendAction
}
from
'
ui/src/components/icons
'
import
{
useEnabledChains
}
from
'
uniswap/src/features/chains/hooks/useEnabledChains
'
import
{
useEnabledChains
}
from
'
uniswap/src/features/chains/hooks/useEnabledChains
'
import
{
FeatureFlags
}
from
'
uniswap/src/features/gating/flags
'
import
{
useFeatureFlag
}
from
'
uniswap/src/features/gating/hooks
'
import
{
ElementName
}
from
'
uniswap/src/features/telemetry/constants
'
import
{
ElementName
}
from
'
uniswap/src/features/telemetry/constants
'
import
{
sendAnalyticsEvent
}
from
'
uniswap/src/features/telemetry/send
'
import
{
sendAnalyticsEvent
}
from
'
uniswap/src/features/telemetry/send
'
import
{
TestnetModeModal
}
from
'
uniswap/src/features/testnets/TestnetModeModal
'
import
{
TestnetModeModal
}
from
'
uniswap/src/features/testnets/TestnetModeModal
'
...
@@ -74,7 +72,6 @@ export const PortfolioActionButtons = memo(function _PortfolioActionButtons(): J
...
@@ -74,7 +72,6 @@ export const PortfolioActionButtons = memo(function _PortfolioActionButtons(): J
const
{
t
}
=
useTranslation
()
const
{
t
}
=
useTranslation
()
const
media
=
useMedia
()
const
media
=
useMedia
()
const
{
isTestnetModeEnabled
}
=
useEnabledChains
()
const
{
isTestnetModeEnabled
}
=
useEnabledChains
()
const
isFiatOffRampEnabled
=
useFeatureFlag
(
FeatureFlags
.
FiatOffRamp
)
const
onSendClick
=
():
void
=>
{
const
onSendClick
=
():
void
=>
{
sendAnalyticsEvent
(
SharedEventName
.
ELEMENT_CLICKED
,
{
sendAnalyticsEvent
(
SharedEventName
.
ELEMENT_CLICKED
,
{
...
@@ -126,11 +123,7 @@ export const PortfolioActionButtons = memo(function _PortfolioActionButtons(): J
...
@@ -126,11 +123,7 @@ export const PortfolioActionButtons = memo(function _PortfolioActionButtons(): J
/>
/>
<
Flex
row
shrink
gap=
"$spacing8"
width=
{
isGrid
?
'
100%
'
:
'
50%
'
}
>
<
Flex
row
shrink
gap=
"$spacing8"
width=
{
isGrid
?
'
100%
'
:
'
50%
'
}
>
<
ActionButton
Icon=
{
<
CoinConvert
/>
}
label=
{
t
(
'
home.label.swap
'
)
}
onClick=
{
onSwapClick
}
/>
<
ActionButton
Icon=
{
<
CoinConvert
/>
}
label=
{
t
(
'
home.label.swap
'
)
}
onClick=
{
onSwapClick
}
/>
<
ActionButton
<
ActionButton
Icon=
{
<
Bank
/>
}
label=
{
t
(
'
home.label.buy
'
)
}
onClick=
{
onBuyClick
}
/>
Icon=
{
<
Bank
/>
}
label=
{
isFiatOffRampEnabled
?
t
(
'
home.label.for
'
)
:
t
(
'
home.label.buy
'
)
}
onClick=
{
onBuyClick
}
/>
</
Flex
>
</
Flex
>
<
Flex
row
shrink
gap=
"$spacing8"
width=
{
isGrid
?
'
100%
'
:
'
50%
'
}
>
<
Flex
row
shrink
gap=
"$spacing8"
width=
{
isGrid
?
'
100%
'
:
'
50%
'
}
>
<
ActionButton
Icon=
{
<
SendAction
/>
}
label=
{
t
(
'
home.label.send
'
)
}
onClick=
{
onSendClick
}
/>
<
ActionButton
Icon=
{
<
SendAction
/>
}
label=
{
t
(
'
home.label.send
'
)
}
onClick=
{
onSendClick
}
/>
...
...
apps/extension/src/manifest.json
View file @
afb0d138
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
"manifest_version"
:
3
,
"manifest_version"
:
3
,
"name"
:
"Uniswap Extension"
,
"name"
:
"Uniswap Extension"
,
"description"
:
"The Uniswap Extension is a self-custody crypto wallet that's built for swapping."
,
"description"
:
"The Uniswap Extension is a self-custody crypto wallet that's built for swapping."
,
"version"
:
"1.2
2.2
"
,
"version"
:
"1.2
3.0
"
,
"minimum_chrome_version"
:
"116"
,
"minimum_chrome_version"
:
"116"
,
"icons"
:
{
"icons"
:
{
"16"
:
"assets/icon16.png"
,
"16"
:
"assets/icon16.png"
,
...
...
apps/mobile/android/app/build.gradle
View file @
afb0d138
...
@@ -71,9 +71,9 @@ if (isCI && datadogPropertiesAvailable) {
...
@@ -71,9 +71,9 @@ if (isCI && datadogPropertiesAvailable) {
apply
from:
"../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle"
apply
from:
"../../../../node_modules/@datadog/mobile-react-native/datadog-sourcemaps.gradle"
}
}
def
devVersionName
=
"1.5
3
"
def
devVersionName
=
"1.5
2.2
"
def
betaVersionName
=
"1.5
3
"
def
betaVersionName
=
"1.5
2.2
"
def
prodVersionName
=
"1.5
3
"
def
prodVersionName
=
"1.5
2.2
"
android
{
android
{
ndkVersion
rootProject
.
ext
.
ndkVersion
ndkVersion
rootProject
.
ext
.
ndkVersion
...
...
apps/mobile/babel.config.js
View file @
afb0d138
...
@@ -10,16 +10,17 @@ module.exports = function (api) {
...
@@ -10,16 +10,17 @@ module.exports = function (api) {
plugins
=
[
plugins
=
[
...
plugins
,
...
plugins
,
process
.
env
.
NODE_ENV
===
'
test
'
// Disable compiler to fix mobile theme issues and media queries
?
null
// process.env.NODE_ENV === 'test'
:
[
// ? null
'
@tamagui/babel-plugin
'
,
// : [
{
// '@tamagui/babel-plugin',
components
:
[
'
ui
'
],
// {
// experimentalFlattenThemesOnNative: true,
// components: ['ui'],
config
:
'
../../packages/ui/src/tamagui.config.ts
'
,
// // experimentalFlattenThemesOnNative: true,
},
// config: '../../packages/ui/src/tamagui.config.ts',
],
// },
// ],
[
[
'
module-resolver
'
,
'
module-resolver
'
,
...
...
apps/mobile/ios/Uniswap.xcodeproj/project.pbxproj
View file @
afb0d138
...
@@ -2821,7 +2821,7 @@
...
@@ -2821,7 +2821,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@loader_path/Frameworks"
,
"@loader_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
...
@@ -2874,7 +2874,7 @@
...
@@ -2874,7 +2874,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@loader_path/Frameworks"
,
"@loader_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
...
@@ -2927,7 +2927,7 @@
...
@@ -2927,7 +2927,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@loader_path/Frameworks"
,
"@loader_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
...
@@ -2980,7 +2980,7 @@
...
@@ -2980,7 +2980,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@loader_path/Frameworks"
,
"@loader_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCore
;
...
@@ -3018,7 +3018,7 @@
...
@@ -3018,7 +3018,7 @@
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GENERATE_INFOPLIST_FILE
=
YES
;
GENERATE_INFOPLIST_FILE
=
YES
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
...
@@ -3054,7 +3054,7 @@
...
@@ -3054,7 +3054,7 @@
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GENERATE_INFOPLIST_FILE
=
YES
;
GENERATE_INFOPLIST_FILE
=
YES
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
...
@@ -3089,7 +3089,7 @@
...
@@ -3089,7 +3089,7 @@
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GENERATE_INFOPLIST_FILE
=
YES
;
GENERATE_INFOPLIST_FILE
=
YES
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
...
@@ -3124,7 +3124,7 @@
...
@@ -3124,7 +3124,7 @@
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GCC_C_LANGUAGE_STANDARD
=
gnu11
;
GENERATE_INFOPLIST_FILE
=
YES
;
GENERATE_INFOPLIST_FILE
=
YES
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
IPHONEOS_DEPLOYMENT_TARGET
=
15.1
;
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
PRODUCT_BUNDLE_IDENTIFIER
=
schemes.WidgetsCoreTests
;
...
@@ -3171,7 +3171,7 @@
...
@@ -3171,7 +3171,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
...
@@ -3217,7 +3217,7 @@
...
@@ -3217,7 +3217,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.widgets
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.widgets
;
...
@@ -3263,7 +3263,7 @@
...
@@ -3263,7 +3263,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.widgets
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.widgets
;
...
@@ -3309,7 +3309,7 @@
...
@@ -3309,7 +3309,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.widgets
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.widgets
;
...
@@ -3351,7 +3351,7 @@
...
@@ -3351,7 +3351,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
...
@@ -3394,7 +3394,7 @@
...
@@ -3394,7 +3394,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.WidgetIntentExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.WidgetIntentExtension
;
...
@@ -3437,7 +3437,7 @@
...
@@ -3437,7 +3437,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.WidgetIntentExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.WidgetIntentExtension
;
...
@@ -3480,7 +3480,7 @@
...
@@ -3480,7 +3480,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.WidgetIntentExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.WidgetIntentExtension
;
...
@@ -3516,7 +3516,7 @@
...
@@ -3516,7 +3516,7 @@
"$(inherited)"
,
"$(inherited)"
,
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
OTHER_LDFLAGS
=
(
OTHER_LDFLAGS
=
(
"$(inherited)"
,
"$(inherited)"
,
"-ObjC"
,
"-ObjC"
,
...
@@ -3554,7 +3554,7 @@
...
@@ -3554,7 +3554,7 @@
"$(inherited)"
,
"$(inherited)"
,
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
OTHER_LDFLAGS
=
(
OTHER_LDFLAGS
=
(
"$(inherited)"
,
"$(inherited)"
,
"-ObjC"
,
"-ObjC"
,
...
@@ -3756,7 +3756,7 @@
...
@@ -3756,7 +3756,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_ENABLE_DEBUG_INFO
=
INCLUDE_SOURCE
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_DEBUG"
;
...
@@ -3801,7 +3801,7 @@
...
@@ -3801,7 +3801,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.OneSignalNotificationServiceExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.OneSignalNotificationServiceExtension
;
...
@@ -3912,7 +3912,7 @@
...
@@ -3912,7 +3912,7 @@
"$(inherited)"
,
"$(inherited)"
,
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
OTHER_LDFLAGS
=
(
OTHER_LDFLAGS
=
(
"$(inherited)"
,
"$(inherited)"
,
"-ObjC"
,
"-ObjC"
,
...
@@ -3984,7 +3984,7 @@
...
@@ -3984,7 +3984,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.OneSignalNotificationServiceExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.beta.OneSignalNotificationServiceExtension
;
...
@@ -4095,7 +4095,7 @@
...
@@ -4095,7 +4095,7 @@
"$(inherited)"
,
"$(inherited)"
,
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
OTHER_LDFLAGS
=
(
OTHER_LDFLAGS
=
(
"$(inherited)"
,
"$(inherited)"
,
"-ObjC"
,
"-ObjC"
,
...
@@ -4167,7 +4167,7 @@
...
@@ -4167,7 +4167,7 @@
"@executable_path/Frameworks"
,
"@executable_path/Frameworks"
,
"@executable_path/../../Frameworks"
,
"@executable_path/../../Frameworks"
,
);
);
MARKETING_VERSION
=
1.5
3
;
MARKETING_VERSION
=
1.5
2.2
;
MTL_FAST_MATH
=
YES
;
MTL_FAST_MATH
=
YES
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
OTHER_SWIFT_FLAGS
=
"$(inherited) -D EXPO_CONFIGURATION_RELEASE"
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.OneSignalNotificationServiceExtension
;
PRODUCT_BUNDLE_IDENTIFIER
=
com.uniswap.mobile.dev.OneSignalNotificationServiceExtension
;
...
...
apps/mobile/scripts/checkBundleSize.sh
View file @
afb0d138
#!/bin/bash
#!/bin/bash
MAX_SIZE
=
2
4
MAX_SIZE
=
2
3.5
MAX_BUFFER
=
0.5
MAX_BUFFER
=
0.5
# Check OS type and use appropriate stat command
# Check OS type and use appropriate stat command
...
...
apps/mobile/src/features/walletConnect/batchedTransactionSaga.ts
View file @
afb0d138
...
@@ -175,7 +175,9 @@ export function* handleGetCapabilities({
...
@@ -175,7 +175,9 @@ export function* handleGetCapabilities({
const
detailsMap
=
delegationStatusResponse
.
delegationDetails
[
accountAddress
]
const
detailsMap
=
delegationStatusResponse
.
delegationDetails
[
accountAddress
]
if
(
detailsMap
)
{
if
(
detailsMap
)
{
const
hasAtLeastOneDelegation
=
Object
.
values
(
detailsMap
).
some
((
details
)
=>
!!
details
.
currentDelegationAddress
)
const
hasAtLeastOneDelegation
=
Object
.
values
(
detailsMap
).
some
(
(
details
)
=>
!!
details
.
currentDelegationAddress
&&
!
details
.
isWalletDelegatedToUniswap
,
)
hasNoExistingDelegations
=
!
hasAtLeastOneDelegation
hasNoExistingDelegations
=
!
hasAtLeastOneDelegation
}
}
...
...
apps/mobile/src/screens/HomeScreen/HomeScreen.tsx
View file @
afb0d138
...
@@ -296,7 +296,7 @@ export function HomeScreen(props?: AppStackScreenProp<MobileScreens.Home>): JSX.
...
@@ -296,7 +296,7 @@ export function HomeScreen(props?: AppStackScreenProp<MobileScreens.Home>): JSX.
}
}
return
(
return
(
<
Flex
borderRadius=
"$rounded16"
width=
"100%"
aspectRatio=
{
16
/
9
}
overflow=
"hidden"
>
<
Flex
borderRadius=
"$rounded16"
width=
"100%"
aspectRatio=
{
16
/
9
}
overflow=
"hidden"
mb=
"$spacing8"
>
<
Video
<
Video
source=
{
SMART_WALLET_UPGRADE_VIDEO
}
source=
{
SMART_WALLET_UPGRADE_VIDEO
}
poster=
{
SMART_WALLET_UPGRADE_FALLBACK
}
poster=
{
SMART_WALLET_UPGRADE_FALLBACK
}
...
...
apps/mobile/src/screens/Import/SelectWalletScreen.tsx
View file @
afb0d138
import
{
NativeStackScreenProps
}
from
'
@react-navigation/native-stack
'
import
{
NativeStackScreenProps
}
from
'
@react-navigation/native-stack
'
import
React
,
{
ComponentProps
,
useCallback
}
from
'
react
'
import
React
,
{
ComponentProps
,
useCallback
}
from
'
react
'
import
{
Trans
,
useTranslation
}
from
'
react-i18next
'
import
{
Trans
,
useTranslation
}
from
'
react-i18next
'
import
{
ScrollView
}
from
'
react-native
'
import
{
ScrollView
,
StyleSheet
}
from
'
react-native
'
import
Animated
,
{
useAnimatedStyle
,
withTiming
}
from
'
react-native-reanimated
'
import
Animated
,
{
useAnimatedStyle
,
withTiming
}
from
'
react-native-reanimated
'
import
{
navigate
}
from
'
src/app/navigation/rootNavigation
'
import
{
navigate
}
from
'
src/app/navigation/rootNavigation
'
import
{
OnboardingStackParamList
}
from
'
src/app/navigation/types
'
import
{
OnboardingStackParamList
}
from
'
src/app/navigation/types
'
import
{
OnboardingScreen
}
from
'
src/features/onboarding/OnboardingScreen
'
import
{
OnboardingScreen
}
from
'
src/features/onboarding/OnboardingScreen
'
import
{
Button
,
Flex
,
Loader
,
Text
,
TouchableArea
,
useLayoutAnimationOnChange
}
from
'
ui/src
'
import
{
Button
,
Flex
,
LinearGradient
,
Loader
,
Text
,
TouchableArea
,
useLayoutAnimationOnChange
,
useSporeColors
,
}
from
'
ui/src
'
import
{
WalletFilled
}
from
'
ui/src/components/icons
'
import
{
WalletFilled
}
from
'
ui/src/components/icons
'
import
{
spacing
}
from
'
ui/src/theme
'
import
{
opacify
,
spacing
}
from
'
ui/src/theme
'
import
{
BaseCard
}
from
'
uniswap/src/components/BaseCard/BaseCard
'
import
{
BaseCard
}
from
'
uniswap/src/components/BaseCard/BaseCard
'
import
{
FeatureFlags
}
from
'
uniswap/src/features/gating/flags
'
import
{
FeatureFlags
}
from
'
uniswap/src/features/gating/flags
'
import
{
useFeatureFlag
}
from
'
uniswap/src/features/gating/hooks
'
import
{
useFeatureFlag
}
from
'
uniswap/src/features/gating/hooks
'
...
@@ -31,6 +40,7 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
...
@@ -31,6 +40,7 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
const
{
t
}
=
useTranslation
()
const
{
t
}
=
useTranslation
()
const
{
selectImportedAccounts
,
getImportedAccountsAddresses
}
=
useOnboardingContext
()
const
{
selectImportedAccounts
,
getImportedAccountsAddresses
}
=
useOnboardingContext
()
const
importedAddresses
=
getImportedAccountsAddresses
()
const
importedAddresses
=
getImportedAccountsAddresses
()
const
colors
=
useSporeColors
()
const
{
const
{
importableAccounts
,
importableAccounts
,
...
@@ -103,39 +113,54 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
...
@@ -103,39 +113,54 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
<
Loader
.
Wallets
repeat=
{
5
}
/>
<
Loader
.
Wallets
repeat=
{
5
}
/>
</
Flex
>
</
Flex
>
)
:
(
)
:
(
<
ScrollView
testID=
{
TestID
.
SelectWalletScreenLoaded
}
>
<
Flex
flexGrow=
{
1
}
flexShrink=
{
1
}
>
<
Flex
height=
"$spacing12"
/>
<
LinearGradient
<
Flex
gap=
"$gap12"
>
colors=
{
[
colors
.
surface1
.
val
,
opacify
(
0
,
colors
.
surface1
.
val
)]
}
{
importableAccounts
?.
map
((
account
,
i
)
=>
{
end=
{
{
x
:
0
,
y
:
1
}
}
const
{
address
,
balance
}
=
account
start=
{
{
x
:
0
,
y
:
0
}
}
// prevents flickering and incorrect width calculation for long wallet names on Android
style=
{
ListSheet
.
topGradient
}
// it's not possible to deselect last wallet
/>
if
(
selectedAddresses
.
length
===
0
)
{
<
ScrollView
testID=
{
TestID
.
SelectWalletScreenLoaded
}
>
return
null
<
Flex
height=
"$spacing12"
/>
}
<
Flex
gap=
"$gap12"
>
return
(
{
importableAccounts
?.
map
((
account
,
i
)
=>
{
<
Flex
key=
{
address
}
px=
"$spacing16"
>
const
{
address
,
balance
}
=
account
<
WalletPreviewCard
// prevents flickering and incorrect width calculation for long wallet names on Android
key=
{
address
}
// it's not possible to deselect last wallet
address=
{
address
}
if
(
selectedAddresses
.
length
===
0
)
{
balance=
{
balance
}
return
null
hideSelectionCircle=
{
isOnlyOneAccount
}
}
name=
{
ElementName
.
WalletCard
}
return
(
selected=
{
selectedAddresses
.
includes
(
address
)
}
<
Flex
key=
{
address
}
px=
"$spacing16"
>
testID=
{
`${TestID.WalletCard}-${i + 1}`
}
<
WalletPreviewCard
onSelect=
{
toggleAddressSelection
}
key=
{
address
}
/>
address=
{
address
}
</
Flex
>
balance=
{
balance
}
)
hideSelectionCircle=
{
isOnlyOneAccount
}
})
}
name=
{
ElementName
.
WalletCard
}
</
Flex
>
selected=
{
selectedAddresses
.
includes
(
address
)
}
</
ScrollView
>
testID=
{
`${TestID.WalletCard}-${i + 1}`
}
onSelect=
{
toggleAddressSelection
}
/>
</
Flex
>
)
})
}
</
Flex
>
</
ScrollView
>
<
LinearGradient
colors=
{
[
opacify
(
0
,
colors
.
surface1
.
val
),
colors
.
surface1
.
val
]
}
end=
{
{
x
:
0
,
y
:
1
}
}
start=
{
{
x
:
0
,
y
:
0
}
}
style=
{
ListSheet
.
bottomGradient
}
/>
</
Flex
>
)
}
)
}
<
Animated
.
View
<
Animated
.
View
style=
{
[
style=
{
[
opacityStyle
,
opacityStyle
,
{
{
marginBottom
:
spacing
.
spacing16
,
marginBottom
:
spacing
.
spacing16
,
marginTop
:
spacing
.
spacing16
,
marginHorizontal
:
spacing
.
spacing24
,
marginHorizontal
:
spacing
.
spacing24
,
},
},
]
}
]
}
...
@@ -175,6 +200,24 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
...
@@ -175,6 +200,24 @@ export function SelectWalletScreen({ navigation, route: { params } }: Props): JS
)
)
}
}
const
ListSheet
=
StyleSheet
.
create
({
bottomGradient
:
{
bottom
:
0
,
height
:
spacing
.
spacing16
,
left
:
0
,
position
:
'
absolute
'
,
width
:
'
100%
'
,
},
topGradient
:
{
height
:
spacing
.
spacing16
,
left
:
0
,
position
:
'
absolute
'
,
top
:
0
,
width
:
'
100%
'
,
zIndex
:
1
,
},
})
function
CustomHighlightText
(
props
:
ComponentProps
<
typeof
Text
>
):
JSX
.
Element
{
function
CustomHighlightText
(
props
:
ComponentProps
<
typeof
Text
>
):
JSX
.
Element
{
return
<
Text
variant=
"buttonLabel4"
color=
"$neutral1"
{
...
props
}
/>
return
<
Text
variant=
"buttonLabel4"
color=
"$neutral1"
{
...
props
}
/>
}
}
apps/mobile/src/screens/SettingsFiatCurrencyModal.tsx
View file @
afb0d138
import
{
FlashList
}
from
'
@shopify/flash-list
'
import
React
,
{
useCallback
}
from
'
react
'
import
React
,
{
useCallback
}
from
'
react
'
import
{
useTranslation
}
from
'
react-i18next
'
import
{
useTranslation
}
from
'
react-i18next
'
import
{
useDispatch
}
from
'
react-redux
'
import
{
useDispatch
}
from
'
react-redux
'
import
{
useReactNavigationModal
}
from
'
src/components/modals/useReactNavigationModal
'
import
{
useReactNavigationModal
}
from
'
src/components/modals/useReactNavigationModal
'
import
{
Flex
,
Text
,
TouchableArea
}
from
'
ui/src
'
import
{
Flex
,
Text
,
TouchableArea
}
from
'
ui/src
'
import
{
AnimatedBottomSheetFlashList
}
from
'
ui/src/components/AnimatedFlashList/AnimatedFlashList
'
import
{
Check
}
from
'
ui/src/components/icons
'
import
{
Check
}
from
'
ui/src/components/icons
'
import
{
Modal
}
from
'
uniswap/src/components/modals/Modal
'
import
{
Modal
}
from
'
uniswap/src/components/modals/Modal
'
import
{
FiatCurrency
,
ORDERED_CURRENCIES
}
from
'
uniswap/src/features/fiatCurrency/constants
'
import
{
FiatCurrency
,
ORDERED_CURRENCIES
}
from
'
uniswap/src/features/fiatCurrency/constants
'
...
@@ -29,7 +29,11 @@ export function SettingsFiatCurrencyModal(): JSX.Element {
...
@@ -29,7 +29,11 @@ export function SettingsFiatCurrencyModal(): JSX.Element {
<
Text
pb=
"$spacing12"
textAlign=
"center"
variant=
"subheading1"
>
<
Text
pb=
"$spacing12"
textAlign=
"center"
variant=
"subheading1"
>
{
t
(
'
settings.setting.currency.title
'
)
}
{
t
(
'
settings.setting.currency.title
'
)
}
</
Text
>
</
Text
>
<
FlashList
data=
{
ORDERED_CURRENCIES
}
keyExtractor=
{
(
item
:
FiatCurrency
)
=>
item
}
renderItem=
{
renderItem
}
/>
<
AnimatedBottomSheetFlashList
data=
{
ORDERED_CURRENCIES
}
keyExtractor=
{
(
item
:
FiatCurrency
)
=>
item
}
renderItem=
{
renderItem
}
/>
</
Modal
>
</
Modal
>
)
)
}
}
...
...
packages/uniswap/src/components/modals/WarningModal/WarningModal.tsx
View file @
afb0d138
...
@@ -10,7 +10,7 @@ import Trace from 'uniswap/src/features/telemetry/Trace'
...
@@ -10,7 +10,7 @@ import Trace from 'uniswap/src/features/telemetry/Trace'
import
{
ElementName
,
ModalNameType
}
from
'
uniswap/src/features/telemetry/constants
'
import
{
ElementName
,
ModalNameType
}
from
'
uniswap/src/features/telemetry/constants
'
import
{
SwapFormContext
}
from
'
uniswap/src/features/transactions/swap/contexts/SwapFormContext
'
import
{
SwapFormContext
}
from
'
uniswap/src/features/transactions/swap/contexts/SwapFormContext
'
import
{
TestID
}
from
'
uniswap/src/test/fixtures/testIDs
'
import
{
TestID
}
from
'
uniswap/src/test/fixtures/testIDs
'
import
{
isWeb
}
from
'
utilities/src/platform
'
import
{
is
MobileApp
,
is
Web
}
from
'
utilities/src/platform
'
type
WarningModalContentProps
=
{
type
WarningModalContentProps
=
{
onClose
?:
()
=>
void
onClose
?:
()
=>
void
...
@@ -49,7 +49,7 @@ export function WarningModalContent({
...
@@ -49,7 +49,7 @@ export function WarningModalContent({
titleComponent
,
titleComponent
,
caption
,
caption
,
captionComponent
,
captionComponent
,
rejectText
:
rejectText
,
rejectText
,
acknowledgeText
,
acknowledgeText
,
severity
=
WarningSeverity
.
Medium
,
severity
=
WarningSeverity
.
Medium
,
children
,
children
,
...
@@ -63,6 +63,8 @@ export function WarningModalContent({
...
@@ -63,6 +63,8 @@ export function WarningModalContent({
const
colors
=
useSporeColors
()
const
colors
=
useSporeColors
()
const
{
headerText
:
alertHeaderTextColor
}
=
getAlertColor
(
severity
)
const
{
headerText
:
alertHeaderTextColor
}
=
getAlertColor
(
severity
)
const
buttonSize
=
isMobileApp
?
'
medium
'
:
'
small
'
return
(
return
(
<
Flex
<
Flex
centered
centered
...
@@ -107,14 +109,14 @@ export function WarningModalContent({
...
@@ -107,14 +109,14 @@ export function WarningModalContent({
<
Flex
row
alignSelf=
"stretch"
gap=
"$spacing12"
pt=
{
children
?
'
$spacing12
'
:
'
$spacing24
'
}
>
<
Flex
row
alignSelf=
"stretch"
gap=
"$spacing12"
pt=
{
children
?
'
$spacing12
'
:
'
$spacing24
'
}
>
{
rejectText
&&
(
{
rejectText
&&
(
<
Trace
logPress
element=
{
ElementName
.
BackButton
}
modal=
{
modalName
}
properties=
{
analyticsProperties
}
>
<
Trace
logPress
element=
{
ElementName
.
BackButton
}
modal=
{
modalName
}
properties=
{
analyticsProperties
}
>
<
Button
emphasis=
"secondary"
onPress=
{
onReject
??
onClose
}
>
<
Button
size=
{
buttonSize
}
emphasis=
"secondary"
onPress=
{
onReject
??
onClose
}
>
{
rejectText
}
{
rejectText
}
</
Button
>
</
Button
>
</
Trace
>
</
Trace
>
)
}
)
}
{
acknowledgeText
&&
(
{
acknowledgeText
&&
(
<
Trace
logPress
element=
{
ElementName
.
Confirm
}
modal=
{
modalName
}
properties=
{
analyticsProperties
}
>
<
Trace
logPress
element=
{
ElementName
.
Confirm
}
modal=
{
modalName
}
properties=
{
analyticsProperties
}
>
<
Button
testID=
{
TestID
.
Confirm
}
onPress=
{
onAcknowledge
}
>
<
Button
size=
{
buttonSize
}
testID=
{
TestID
.
Confirm
}
onPress=
{
onAcknowledge
}
>
{
acknowledgeText
}
{
acknowledgeText
}
</
Button
>
</
Button
>
</
Trace
>
</
Trace
>
...
...
packages/uniswap/src/constants/urls.ts
View file @
afb0d138
...
@@ -79,7 +79,6 @@ export const uniswapUrls = {
...
@@ -79,7 +79,6 @@ export const uniswapUrls = {
swapFeeInfo
:
createHelpArticleUrl
(
'
20131678274957
'
),
swapFeeInfo
:
createHelpArticleUrl
(
'
20131678274957
'
),
passkeysInfo
:
createHelpArticleUrl
(
'
35522111260173
'
),
passkeysInfo
:
createHelpArticleUrl
(
'
35522111260173
'
),
smartWalletDelegation
:
createHelpArticleUrl
(
'
36391987158797
'
),
smartWalletDelegation
:
createHelpArticleUrl
(
'
36391987158797
'
),
smartWalletNetworkCost
:
createHelpArticleUrl
(
'
8370337377805
'
),
swapProtection
:
createHelpArticleUrl
(
'
18814993155853
'
),
swapProtection
:
createHelpArticleUrl
(
'
18814993155853
'
),
swapSlippage
:
createHelpArticleUrl
(
'
8643879653261-What-is-Price-Slippage-
'
),
swapSlippage
:
createHelpArticleUrl
(
'
8643879653261-What-is-Price-Slippage-
'
),
tokenWarning
:
createHelpArticleUrl
(
'
8723118437133-What-are-token-warnings-
'
),
tokenWarning
:
createHelpArticleUrl
(
'
8723118437133-What-are-token-warnings-
'
),
...
...
packages/uniswap/src/extension/useIsChromeWindowFocused.ts
View file @
afb0d138
import
{
useEffect
,
useState
}
from
'
react
'
import
{
use
Callback
,
use
Effect
,
useState
}
from
'
react
'
import
{
getChromeWithThrow
}
from
'
utilities/src/chrome/chrome
'
import
{
getChromeWithThrow
}
from
'
utilities/src/chrome/chrome
'
import
{
logger
}
from
'
utilities/src/logger/logger
'
import
{
isExtension
}
from
'
utilities/src/platform
'
import
{
isExtension
}
from
'
utilities/src/platform
'
import
{
useAsyncData
}
from
'
utilities/src/react/hooks
'
export
function
useIsChromeWindowFocused
():
boolean
{
export
function
useIsChromeWindowFocused
():
boolean
{
const
[
isFocused
,
setIsFocused
]
=
useState
(
true
)
const
[
isFocused
,
setIsFocused
]
=
useState
(
true
)
useEffect
(()
=>
{
useAsyncData
(
if
(
!
isExtension
)
{
useCallback
(
async
()
=>
{
return
undefined
if
(
!
isExtension
)
{
}
// This hook is ignored and always returns `true` when not in the Extension.
return
undefined
const
chrome
=
getChromeWithThrow
()
}
const
onFocusChangedListener
=
async
():
Promise
<
void
>
=>
{
const
onFocusChangedListener
=
async
():
Promise
<
void
>
=>
{
const
{
focused
}
=
await
chrome
.
windows
.
getCurrent
()
const
{
focused
}
=
await
chrome
.
windows
.
getCurrent
()
setIsFocused
(
focused
)
setIsFocused
(
focused
)
}
}
// Get initial state
// We run this on first render to get the initial state.
onFocusChangedListener
().
catch
((
error
)
=>
{
await
onFocusChangedListener
()
logger
.
error
(
error
,
{
tags
:
{
const
chrome
=
getChromeWithThrow
()
file
:
'
useIsChromeWindowFocused.ts
'
,
chrome
.
windows
.
onFocusChanged
.
addListener
(
onFocusChangedListener
)
function
:
'
useIsChromeWindowFocused
'
,
},
return
()
=>
{
})
chrome
.
windows
.
onFocusChanged
.
removeListener
(
onFocusChangedListener
)
})
}
},
[]),
chrome
.
windows
.
onFocusChanged
.
addListener
(
onFocusChangedListener
)
)
// Remove listener when component unmounts
return
()
=>
{
chrome
.
windows
.
onFocusChanged
.
removeListener
(
onFocusChangedListener
)
}
},
[])
return
isFocused
return
isFocused
}
}
...
...
packages/uniswap/src/features/gating/flags.ts
View file @
afb0d138
...
@@ -13,7 +13,6 @@ export enum FeatureFlags {
...
@@ -13,7 +13,6 @@ export enum FeatureFlags {
Datadog
,
Datadog
,
DisableSwap7702
,
DisableSwap7702
,
EmbeddedWallet
,
EmbeddedWallet
,
FiatOffRamp
,
InstantTokenBalanceUpdate
,
InstantTokenBalanceUpdate
,
MonadTestnet
,
MonadTestnet
,
MonadTestnetDown
,
MonadTestnetDown
,
...
@@ -59,6 +58,7 @@ export enum FeatureFlags {
...
@@ -59,6 +58,7 @@ export enum FeatureFlags {
AATestWeb
,
AATestWeb
,
ConversionTracking
,
ConversionTracking
,
DummyFlagTest
,
DummyFlagTest
,
FiatOffRamp
,
GoogleConversionTracking
,
GoogleConversionTracking
,
GqlTokenLists
,
GqlTokenLists
,
LimitsFees
,
LimitsFees
,
...
@@ -82,7 +82,6 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
...
@@ -82,7 +82,6 @@ export const SHARED_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[
FeatureFlags
.
EmbeddedWallet
,
'
embedded_wallet
'
],
[
FeatureFlags
.
EmbeddedWallet
,
'
embedded_wallet
'
],
[
FeatureFlags
.
EnablePermitMismatchUX
,
'
enable_permit2_mismatch_ux
'
],
[
FeatureFlags
.
EnablePermitMismatchUX
,
'
enable_permit2_mismatch_ux
'
],
[
FeatureFlags
.
ExecuteTransactionV2
,
'
new_execute_transaction_arch
'
],
[
FeatureFlags
.
ExecuteTransactionV2
,
'
new_execute_transaction_arch
'
],
[
FeatureFlags
.
FiatOffRamp
,
'
fiat_offramp
'
],
[
FeatureFlags
.
ForceDisableWalletGetCapabilities
,
'
force_disable_wallet_get_capabilities
'
],
[
FeatureFlags
.
ForceDisableWalletGetCapabilities
,
'
force_disable_wallet_get_capabilities
'
],
[
FeatureFlags
.
ForcePermitTransactions
,
'
force_permit_transactions
'
],
[
FeatureFlags
.
ForcePermitTransactions
,
'
force_permit_transactions
'
],
[
FeatureFlags
.
InstantTokenBalanceUpdate
,
'
instant-token-balance-update
'
],
[
FeatureFlags
.
InstantTokenBalanceUpdate
,
'
instant-token-balance-update
'
],
...
@@ -110,6 +109,7 @@ export const WEB_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
...
@@ -110,6 +109,7 @@ export const WEB_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[
FeatureFlags
.
BatchedSwaps
,
'
batched_swaps
'
],
[
FeatureFlags
.
BatchedSwaps
,
'
batched_swaps
'
],
[
FeatureFlags
.
ConversionTracking
,
'
conversion-tracking
'
],
[
FeatureFlags
.
ConversionTracking
,
'
conversion-tracking
'
],
[
FeatureFlags
.
DummyFlagTest
,
'
dummy_flag_test
'
],
[
FeatureFlags
.
DummyFlagTest
,
'
dummy_flag_test
'
],
[
FeatureFlags
.
FiatOffRamp
,
'
fiat_offramp
'
],
[
FeatureFlags
.
GoogleConversionTracking
,
'
google_conversion_tracking
'
],
[
FeatureFlags
.
GoogleConversionTracking
,
'
google_conversion_tracking
'
],
[
FeatureFlags
.
GqlTokenLists
,
'
gql_token_lists
'
],
[
FeatureFlags
.
GqlTokenLists
,
'
gql_token_lists
'
],
[
FeatureFlags
.
LimitsFees
,
'
limits_fees
'
],
[
FeatureFlags
.
LimitsFees
,
'
limits_fees
'
],
...
...
packages/uniswap/src/features/smartWallet/banner/NetworkCostBanner.tsx
View file @
afb0d138
...
@@ -17,13 +17,11 @@ export function NetworkCostBanner({ bannerText, url }: NetworkCostBannerProps):
...
@@ -17,13 +17,11 @@ export function NetworkCostBanner({ bannerText, url }: NetworkCostBannerProps):
return
(
return
(
<
TouchableArea
<
TouchableArea
row
centered
borderWidth=
"$spacing1"
borderWidth=
"$spacing1"
borderColor=
"$surface3"
borderColor=
"$surface3"
borderRadius=
"$rounded12"
borderRadius=
"$rounded12"
p=
"$padding16"
p=
"$padding16"
gap=
"$gap12
"
alignSelf=
"stretch
"
onPress=
{
handleOnPress
}
onPress=
{
handleOnPress
}
>
>
<
Flex
row
alignItems=
"center"
justifyContent=
"space-between"
gap=
"$spacing12"
>
<
Flex
row
alignItems=
"center"
justifyContent=
"space-between"
gap=
"$spacing12"
>
...
...
packages/uniswap/src/features/tokens/TokenWarningModal.tsx
View file @
afb0d138
...
@@ -30,6 +30,7 @@ import {
...
@@ -30,6 +30,7 @@ import {
}
from
'
uniswap/src/features/tokens/safetyUtils
'
}
from
'
uniswap/src/features/tokens/safetyUtils
'
import
{
useDismissedTokenWarnings
}
from
'
uniswap/src/features/tokens/slice/hooks
'
import
{
useDismissedTokenWarnings
}
from
'
uniswap/src/features/tokens/slice/hooks
'
import
{
currencyIdToAddress
}
from
'
uniswap/src/utils/currencyId
'
import
{
currencyIdToAddress
}
from
'
uniswap/src/utils/currencyId
'
import
{
isMobileApp
}
from
'
utilities/src/platform
'
export
interface
FoTPercent
{
export
interface
FoTPercent
{
buyFeePercent
?:
number
buyFeePercent
?:
number
...
@@ -199,7 +200,18 @@ function TokenWarningModalContent({
...
@@ -199,7 +200,18 @@ function TokenWarningModalContent({
<
Text
variant=
"body3"
color=
"$neutral3"
>
<
Text
variant=
"body3"
color=
"$neutral3"
>
<
Trans
<
Trans
i18nKey=
"common.poweredBy"
i18nKey=
"common.poweredBy"
components=
{
{
name
:
<
BlockaidLogo
minHeight=
{
10
}
minWidth=
{
50
}
color=
"$neutral3"
/>
}
}
components=
{
{
name
:
(
<
BlockaidLogo
minHeight=
{
10
}
minWidth=
{
50
}
// Using the "size" prop does not work as expected for non-square icon like this one
// Found that only specifying width fixes all alignment and size issues on mobile
size=
{
isMobileApp
?
({
width
:
50
}
as
{
width
:
number
;
height
:
number
})
:
undefined
}
color=
"$neutral3"
/>
),
}
}
/>
/>
</
Text
>
</
Text
>
</
Flex
>
</
Flex
>
...
...
packages/uniswap/src/features/transactions/modals/NetworkFeeWarning.tsx
View file @
afb0d138
...
@@ -52,7 +52,7 @@ export function NetworkFeeWarning({
...
@@ -52,7 +52,7 @@ export function NetworkFeeWarning({
isMobileApp
&&
(
isMobileApp
&&
(
<
NetworkCostBanner
<
NetworkCostBanner
bannerText=
{
t
(
'
smartWallet.banner.networkCost
'
,
{
chainName
:
getChainInfo
(
chainId
).
label
})
}
bannerText=
{
t
(
'
smartWallet.banner.networkCost
'
,
{
chainName
:
getChainInfo
(
chainId
).
label
})
}
url=
{
uniswapUrls
.
helpArticleUrls
.
smartWallet
NetworkCost
}
url=
{
uniswapUrls
.
helpArticleUrls
.
smartWallet
Delegation
}
/>
/>
)
)
}
}
...
@@ -123,10 +123,12 @@ function InfoButton({
...
@@ -123,10 +123,12 @@ function InfoButton({
}):
JSX
.
Element
|
null
{
}):
JSX
.
Element
|
null
{
if
(
includesDelegation
&&
isMobileApp
)
{
if
(
includesDelegation
&&
isMobileApp
)
{
return
(
return
(
<
LearnMoreLink
<
Flex
mb=
"$spacing8"
>
textVariant=
{
isWeb
?
'
body4
'
:
undefined
}
<
LearnMoreLink
url=
{
uniswapUrls
.
helpArticleUrls
.
smartWalletNetworkCost
}
textVariant=
{
isWeb
?
'
body4
'
:
'
buttonLabel3
'
}
/>
url=
{
uniswapUrls
.
helpArticleUrls
.
networkFeeInfo
}
/>
</
Flex
>
)
)
}
}
...
...
packages/uniswap/src/features/transactions/swap/form/SwapFormScreen/SwapFormTooltips/SwapFormTooltips.tsx
View file @
afb0d138
...
@@ -311,7 +311,7 @@ export function NetworkCostTooltipClassic({ chainId }: { chainId: UniverseChainI
...
@@ -311,7 +311,7 @@ export function NetworkCostTooltipClassic({ chainId }: { chainId: UniverseChainI
logo=
{
<
NetworkLogo
chainId=
{
chainId
}
size=
{
16
}
/>
}
logo=
{
<
NetworkLogo
chainId=
{
chainId
}
size=
{
16
}
/>
}
/>
/>
<
SwapDetailsTooltip
.
Description
<
SwapDetailsTooltip
.
Description
learnMoreUrl=
{
uniswapUrls
.
helpArticleUrls
.
smartWalletNetworkCost
}
learnMoreUrl=
{
uniswapUrls
.
helpArticleUrls
.
networkFeeInfo
}
text=
{
t
(
'
transaction.networkCost.description
'
)
}
text=
{
t
(
'
transaction.networkCost.description
'
)
}
/>
/>
</
SwapDetailsTooltip
.
Outer
>
</
SwapDetailsTooltip
.
Outer
>
...
...
packages/wallet/src/features/smartWallet/modals/SmartWalletModal.tsx
View file @
afb0d138
...
@@ -55,6 +55,7 @@ export function SmartWalletModal({
...
@@ -55,6 +55,7 @@ export function SmartWalletModal({
}:
SmartWalletModalProps
):
JSX
.
Element
{
}:
SmartWalletModalProps
):
JSX
.
Element
{
return
(
return
(
<
Modal
<
Modal
renderBehindTopInset
alignment=
{
alignment
}
alignment=
{
alignment
}
isModalOpen=
{
isOpen
}
isModalOpen=
{
isOpen
}
name=
{
modalName
}
name=
{
modalName
}
...
@@ -69,10 +70,10 @@ export function SmartWalletModal({
...
@@ -69,10 +70,10 @@ export function SmartWalletModal({
px=
{
isExtension
?
null
:
'
$spacing24
'
}
px=
{
isExtension
?
null
:
'
$spacing24
'
}
mb=
{
isExtension
?
null
:
'
$spacing48
'
}
mb=
{
isExtension
?
null
:
'
$spacing48
'
}
gap=
"$spacing16"
gap=
"$spacing16"
pt=
{
isExtension
?
null
:
video
?
'
$spacing24
'
:
'
$spacing12
'
}
>
>
{
video
?
video
:
icon
}
{
video
?
video
:
icon
}
<
Flex
flexDirection=
"column"
alignItems=
"center"
gap=
"$gap8"
>
<
Flex
flexDirection=
"column"
alignItems=
"center"
gap=
"$spacing8"
>
<
Text
variant=
"subheading2"
color=
"$neutral1"
>
<
Text
variant=
"subheading2"
color=
"$neutral1"
>
{
title
}
{
title
}
</
Text
>
</
Text
>
...
...
yarn.lock
View file @
afb0d138
...
@@ -16782,6 +16782,7 @@ __metadata:
...
@@ -16782,6 +16782,7 @@ __metadata:
react-native-reanimated: 3.16.7
react-native-reanimated: 3.16.7
react-native-svg: 15.10.1
react-native-svg: 15.10.1
react-native-web: 0.19.13
react-native-web: 0.19.13
react-player: 2.16.0
react-qr-code: 2.0.12
react-qr-code: 2.0.12
react-redux: 8.0.5
react-redux: 8.0.5
react-refresh: 0.14.0
react-refresh: 0.14.0
...
@@ -24142,7 +24143,7 @@ __metadata:
...
@@ -24142,7 +24143,7 @@ __metadata:
languageName: node
languageName: node
linkType: hard
linkType: hard
"deepmerge@npm:^4.2.2, deepmerge@npm:^4.3.0, deepmerge@npm:^4.3.1":
"deepmerge@npm:^4.
0.0, deepmerge@npm:^4.
2.2, deepmerge@npm:^4.3.0, deepmerge@npm:^4.3.1":
version: 4.3.1
version: 4.3.1
resolution: "deepmerge@npm:4.3.1"
resolution: "deepmerge@npm:4.3.1"
checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052
checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052
...
@@ -34143,6 +34144,13 @@ __metadata:
...
@@ -34143,6 +34144,13 @@ __metadata:
languageName: node
languageName: node
linkType: hard
linkType: hard
"load-script@npm:^1.0.0":
version: 1.0.0
resolution: "load-script@npm:1.0.0"
checksum: 8458e3f07b4a86f8d9d66e47a987811491a5d013af23ba7b371c6d3c9dc899885b072ccf65abf7874c10cb197d4975eacd8a7a125bfb38dbbcb267539f5dc1e9
languageName: node
linkType: hard
"loader-runner@npm:^4.2.0":
"loader-runner@npm:^4.2.0":
version: 4.3.0
version: 4.3.0
resolution: "loader-runner@npm:4.3.0"
resolution: "loader-runner@npm:4.3.0"
...
@@ -34893,7 +34901,7 @@ __metadata:
...
@@ -34893,7 +34901,7 @@ __metadata:
languageName: node
languageName: node
linkType: hard
linkType: hard
"memoize-one@npm:>=3.1.1 <6, memoize-one@npm:^5.0.0":
"memoize-one@npm:>=3.1.1 <6, memoize-one@npm:^5.0.0
, memoize-one@npm:^5.1.1
":
version: 5.2.1
version: 5.2.1
resolution: "memoize-one@npm:5.2.1"
resolution: "memoize-one@npm:5.2.1"
checksum: a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d
checksum: a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d
...
@@ -40760,6 +40768,21 @@ __metadata:
...
@@ -40760,6 +40768,21 @@ __metadata:
languageName: node
languageName: node
linkType: hard
linkType: hard
"react-player@npm:2.16.0":
version: 2.16.0
resolution: "react-player@npm:2.16.0"
dependencies:
deepmerge: ^4.0.0
load-script: ^1.0.0
memoize-one: ^5.1.1
prop-types: ^15.7.2
react-fast-compare: ^3.0.1
peerDependencies:
react: ">=16.6.0"
checksum: 9cc78a6099fdf06bbb2e1db75aa57461fb152eb6207a00e6e026dde0675b6f4ad02a45cab7b6c18a9f19e001bf9695a5be0cbe7606eca57a0af501ced717fbe9
languageName: node
linkType: hard
"react-popper@npm:2.3.0":
"react-popper@npm:2.3.0":
version: 2.3.0
version: 2.3.0
resolution: "react-popper@npm:2.3.0"
resolution: "react-popper@npm:2.3.0"
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment