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
aa949db3
Commit
aa949db3
authored
Jun 13, 2024
by
Uniswap Labs Service Account
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ci(release): publish latest release
parent
1d59f92a
Changes
38
Hide whitespace changes
Inline
Side-by-side
Showing
38 changed files
with
255 additions
and
110 deletions
+255
-110
RELEASE
RELEASE
+11
-6
VERSION
VERSION
+1
-1
package.json
apps/mobile/package.json
+2
-2
.env
apps/web/.env
+1
-0
getNetworkLogoURL.ts
apps/web/functions/utils/getNetworkLogoURL.ts
+2
-0
package.json
apps/web/package.json
+4
-4
csp.json
apps/web/public/csp.json
+2
-1
zkSync_Logo.png
apps/web/public/images/logos/zkSync_Logo.png
+0
-0
parseLocal.test.ts
...s/AccountDrawer/MiniPortfolio/Activity/parseLocal.test.ts
+9
-6
utils.ts
.../components/AccountDrawer/MiniPortfolio/Activity/utils.ts
+3
-3
useMultiChainPositions.tsx
...ountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx
+1
-1
FeatureFlagModal.tsx
.../web/src/components/FeatureFlagModal/FeatureFlagModal.tsx
+4
-1
ChainLogo.tsx
apps/web/src/components/Logo/ChainLogo.tsx
+13
-0
chains.test.ts
apps/web/src/constants/chains.test.ts
+8
-1
chains.ts
apps/web/src/constants/chains.ts
+7
-1
lists.ts
apps/web/src/constants/lists.ts
+2
-1
routing.ts
apps/web/src/constants/routing.ts
+9
-5
tokens.ts
apps/web/src/constants/tokens.ts
+7
-0
usePermit2Allowance.ts
apps/web/src/hooks/usePermit2Allowance.ts
+11
-7
usePermitAllowance.ts
apps/web/src/hooks/usePermitAllowance.ts
+7
-3
usePools.ts
apps/web/src/hooks/usePools.ts
+10
-3
gas.ts
apps/web/src/state/routing/gas.ts
+3
-3
hooks.test.tsx
apps/web/src/state/transactions/hooks.test.tsx
+16
-14
getExplorerLink.ts
apps/web/src/utils/getExplorerLink.ts
+1
-0
package.json
package.json
+2
-2
index.ts
packages/ui/src/assets/index.ts
+1
-0
zksync-logo.png
packages/ui/src/assets/logos/png/zksync-logo.png
+0
-0
package.json
packages/uniswap/package.json
+1
-1
config.ts
packages/uniswap/src/config.ts
+2
-0
chains.ts
packages/uniswap/src/constants/chains.ts
+58
-1
tokens.ts
packages/uniswap/src/constants/tokens.ts
+7
-0
schema.graphql
.../uniswap/src/data/graphql/uniswap-data-api/schema.graphql
+1
-0
flags.ts
packages/uniswap/src/features/gating/flags.ts
+2
-0
trace.ts
packages/uniswap/src/features/telemetry/constants/trace.ts
+1
-0
package.json
packages/utilities/package.json
+1
-1
package.json
packages/wallet/package.json
+4
-4
usePermit2Signature.ts
...let/src/features/transactions/swap/usePermit2Signature.ts
+4
-4
yarn.lock
yarn.lock
+37
-34
No files found.
RELEASE
View file @
aa949db3
IPFS hash of the deployment:
- CIDv0: `Qm
U2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH
`
- CIDv1: `bafybei
cususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi
`
- CIDv0: `Qm
WqSfbLDY22q6duTWFocMGoy317SVW13YLpc1yrkrHoeJ
`
- CIDv1: `bafybei
d6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm
`
The latest release is always mirrored at [app.uniswap.org](https://app.uniswap.org).
...
...
@@ -10,10 +10,15 @@ You can also access the Uniswap Interface from an IPFS gateway.
Your Uniswap settings are never remembered across different URLs.
IPFS gateways:
- https://bafybei
cususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi
.ipfs.dweb.link/
- https://bafybei
cususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi
.ipfs.cf-ipfs.com/
- [ipfs://Qm
U2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH/](ipfs://QmU2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH
/)
- https://bafybei
d6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm
.ipfs.dweb.link/
- https://bafybei
d6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm
.ipfs.cf-ipfs.com/
- [ipfs://Qm
WqSfbLDY22q6duTWFocMGoy317SVW13YLpc1yrkrHoeJ/](ipfs://QmWqSfbLDY22q6duTWFocMGoy317SVW13YLpc1yrkrHoeJ
/)
### 5.34.1 (2024-06-13)
## 5.35.0 (2024-06-13)
### Features
* **web:** Add ZKsync - prod (#9083) 90c6c69
VERSION
View file @
aa949db3
web/5.34.1
\ No newline at end of file
web/5.35.0
\ No newline at end of file
apps/mobile/package.json
View file @
aa949db3
...
...
@@ -84,8 +84,8 @@
"@uniswap/analytics"
:
"1.7.0"
,
"@uniswap/analytics-events"
:
"2.32.0"
,
"@uniswap/ethers-rs-mobile"
:
"0.0.5"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/v3-sdk"
:
"3.1
1.2
"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"@uniswap/v3-sdk"
:
"3.1
3.0
"
,
"@walletconnect/core"
:
"2.11.2"
,
"@walletconnect/react-native-compat"
:
"2.11.2"
,
"@walletconnect/utils"
:
"2.11.2"
,
...
...
apps/web/.env
View file @
aa949db3
...
...
@@ -9,6 +9,7 @@ REACT_APP_INFURA_KEY="4bf032f2d38a4ed6bb975b80d6340847"
REACT_APP_QUICKNODE_MAINNET_RPC_URL="https://magical-alien-tab.quiknode.pro/669e87e569a8277d3fbd9e202f9df93189f19f4c"
REACT_APP_QUICKNODE_ARBITRUM_RPC_URL="https://black-ultra-valley.arbitrum-mainnet.quiknode.pro/96d7122781cfdcbccf5377cf0c68187332891e79"
REACT_APP_QUICKNODE_ZORA_RPC_URL="https://sly-fabled-breeze.zora-mainnet.quiknode.pro/b9b1f6ade530f3f32c0da16e573fe09eb0eb9132"
REACT_APP_QUICKNODE_ZKSYNC_RPC_URL="https://weathered-young-theorem.zksync-mainnet.quiknode.pro/4cff937b0c3b9c95154711ba0e337052445ef316"
REACT_APP_MOONPAY_API="https://api.moonpay.com"
REACT_APP_MOONPAY_LINK="https://us-central1-uniswap-mobile.cloudfunctions.net/signMoonpayLinkV2?platform=web&env=staging"
REACT_APP_MOONPAY_PUBLISHABLE_KEY="pk_test_DycfESRid31UaSxhI5yWKe1r5E5kKSz"
...
...
apps/web/functions/utils/getNetworkLogoURL.ts
View file @
aa949db3
...
...
@@ -20,6 +20,8 @@ export default function getNetworkLogoUrl(network: string, origin: string) {
return
origin
+
'
/images/logos/Blast_Logo.png
'
case
Chain
.
Zora
:
return
origin
+
'
/images/logos/Zora_Logo.png
'
case
Chain
.
Zksync
:
return
origin
+
'
/images/logos/Zora_Logo.png
'
default
:
return
''
}
...
...
apps/web/package.json
View file @
aa949db3
...
...
@@ -189,20 +189,20 @@
"@uniswap/governance"
:
"1.0.2"
,
"@uniswap/liquidity-staker"
:
"1.0.2"
,
"@uniswap/merkle-distributor"
:
"1.0.1"
,
"@uniswap/permit2-sdk"
:
"1.
2.1
"
,
"@uniswap/permit2-sdk"
:
"1.
3.0
"
,
"@uniswap/redux-multicall"
:
"1.1.8"
,
"@uniswap/router-sdk"
:
"1.9.2"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"@uniswap/smart-order-router"
:
"3.17.3"
,
"@uniswap/token-lists"
:
"1.0.0-beta.33"
,
"@uniswap/uniswapx-sdk"
:
"2.0.4-alpha.1"
,
"@uniswap/universal-router-sdk"
:
"2.
1
.0"
,
"@uniswap/universal-router-sdk"
:
"2.
2
.0"
,
"@uniswap/v2-core"
:
"1.0.1"
,
"@uniswap/v2-periphery"
:
"1.1.0-beta.0"
,
"@uniswap/v2-sdk"
:
"4.3.2"
,
"@uniswap/v3-core"
:
"1.0.1"
,
"@uniswap/v3-periphery"
:
"1.4.4"
,
"@uniswap/v3-sdk"
:
"3.1
1.2
"
,
"@uniswap/v3-sdk"
:
"3.1
3.0
"
,
"@vanilla-extract/css"
:
"1.14.0"
,
"@vanilla-extract/dynamic"
:
"2.1.0"
,
"@vanilla-extract/sprinkles"
:
"1.6.1"
,
...
...
apps/web/public/csp.json
View file @
aa949db3
...
...
@@ -96,6 +96,7 @@
"https://vercel.live/"
,
"https://wallet.crypto.com"
,
"https://web3.1inch.io"
,
"https://mainnet.era.zksync.io/"
,
"wss://*.uniswap.org"
,
"wss://relay.walletconnect.com"
,
"wss://relay.walletconnect.org"
,
...
...
@@ -106,4 +107,4 @@
"'self'"
,
"blob:"
]
}
\ No newline at end of file
}
apps/web/public/images/logos/zkSync_Logo.png
0 → 100644
View file @
aa949db3
1.21 KB
apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/parseLocal.test.ts
View file @
aa949db3
import
'
test-utils/tokens/mocks
'
import
{
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
ChainId
,
TradeType
as
MockTradeType
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
PERMIT2_ADDRESS
}
from
'
@uniswap/universal-router-sdk
'
import
{
getCurrency
}
from
'
components/AccountDrawer/MiniPortfolio/Activity/getCurrency
'
import
{
signatureToActivity
,
transactionToActivity
,
useLocalActivities
,
}
from
'
components/AccountDrawer/MiniPortfolio/Activity/parseLocal
'
import
{
DAI
as
MockDAI
,
USDC_MAINNET
as
MockUSDC_MAINNET
,
USDT
as
MockUSDT
,
nativeOnChain
}
from
'
constants/tokens
'
import
{
SignatureDetails
,
SignatureType
}
from
'
state/signatures/types
'
import
{
...
...
@@ -11,14 +17,11 @@ import {
TransactionDetails
,
TransactionInfo
,
}
from
'
state/transactions/types
'
import
{
mocked
}
from
'
test-utils/mocked
'
import
{
act
,
renderHook
}
from
'
test-utils/render
'
import
{
UniswapXOrderStatus
}
from
'
types/uniswapx
'
import
{
TransactionStatus
}
from
'
uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks
'
import
{
useFormatter
}
from
'
utils/formatNumbers
'
import
{
signatureToActivity
,
transactionToActivity
,
useLocalActivities
}
from
'
./parseLocal
'
import
{
getCurrency
}
from
'
components/AccountDrawer/MiniPortfolio/Activity/getCurrency
'
import
{
mocked
}
from
'
test-utils/mocked
'
function
mockSwapInfo
(
type
:
MockTradeType
,
...
...
@@ -55,7 +58,7 @@ function mockSwapInfo(
const
mockAccount1
=
'
0x000000000000000000000000000000000000000001
'
const
mockAccount2
=
'
0x000000000000000000000000000000000000000002
'
const
mockChainId
=
ChainId
.
MAINNET
const
mockSpenderAddress
=
PERMIT2_ADDRESS
[
mockChainId
]
const
mockSpenderAddress
=
permit2Address
(
mockChainId
)
const
mockCurrencyAmountRaw
=
'
1000000000000000000
'
const
mockCurrencyAmountRawUSDC
=
'
1000000
'
const
mockApprovalAmountRaw
=
'
10000000
'
...
...
apps/web/src/components/AccountDrawer/MiniPortfolio/Activity/utils.ts
View file @
aa949db3
import
{
TransactionRequest
}
from
'
@ethersproject/abstract-provider
'
import
{
Web3Provider
}
from
'
@ethersproject/providers
'
import
{
PERMIT2_ADDRESS
}
from
'
@uniswap/permit2-sdk
'
import
{
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
ChainId
}
from
'
@uniswap/sdk-core
'
import
{
CosignedV2DutchOrder
,
DutchOrder
}
from
'
@uniswap/uniswapx-sdk
'
import
{
getYear
,
isSameDay
,
isSameMonth
,
isSameWeek
,
isSameYear
}
from
'
date-fns
'
...
...
@@ -147,7 +147,7 @@ export function useCancelMultipleOrdersCallback(
orders
?:
Array
<
UniswapXOrderDetails
>
):
()
=>
Promise
<
ContractTransaction
[]
|
undefined
>
{
const
provider
=
useEthersWeb3Provider
()
const
permit2
=
useContract
<
Permit2
>
(
PERMIT2_ADDRESS
,
PERMIT2_ABI
,
true
)
const
permit2
=
useContract
<
Permit2
>
(
permit2Address
(
orders
?.[
0
]?.
chainId
)
,
PERMIT2_ABI
,
true
)
return
useCallback
(
async
()
=>
{
if
(
!
orders
||
orders
.
length
===
0
)
{
...
...
@@ -240,7 +240,7 @@ export function useCreateCancelTransactionRequest(
}
|
undefined
):
TransactionRequest
|
undefined
{
const
permit2
=
useContract
<
Permit2
>
(
PERMIT2_ADDRESS
,
PERMIT2_ABI
,
true
)
const
permit2
=
useContract
<
Permit2
>
(
permit2Address
(
params
?.
chainId
)
,
PERMIT2_ABI
,
true
)
const
transactionFetcher
=
useCallback
(()
=>
{
if
(
!
params
||
...
...
apps/web/src/components/AccountDrawer/MiniPortfolio/Pools/useMultiChainPositions.tsx
View file @
aa949db3
...
...
@@ -128,7 +128,7 @@ export default function useMultiChainPositions(account: string, chains = DEFAULT
let
poolAddress
=
poolAddressCache
.
get
(
details
,
chainId
)
if
(
!
poolAddress
)
{
const
factoryAddress
=
V3_CORE_FACTORY_ADDRESSES
[
chainId
]
poolAddress
=
computePoolAddress
({
factoryAddress
,
tokenA
,
tokenB
,
fee
:
details
.
fee
})
poolAddress
=
computePoolAddress
({
factoryAddress
,
tokenA
,
tokenB
,
fee
:
details
.
fee
,
chainId
})
poolAddressCache
.
set
(
details
,
chainId
,
poolAddress
)
}
poolPairs
.
push
([
tokenA
,
tokenB
])
...
...
apps/web/src/components/FeatureFlagModal/FeatureFlagModal.tsx
View file @
aa949db3
...
...
@@ -222,7 +222,10 @@ export default function FeatureFlagModal() {
<
FeatureFlagOption
flag=
{
FeatureFlags
.
Realtime
}
label=
"Realtime activity updates"
/>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
MultipleRoutingOptions
}
label=
"Enable Multiple Routing Options"
/>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
NavRefresh
}
label=
"Refreshed navigation features"
/>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
Zora
}
label=
"Enable Zora"
/>
<
FeatureFlagGroup
name=
"New Chains"
>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
Zora
}
label=
"Enable Zora"
/>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
ZkSync
}
label=
"Enable ZkSync"
/>
</
FeatureFlagGroup
>
<
FeatureFlagGroup
name=
"Multichain UX"
>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
MultichainUX
}
label=
"Enable Multichain Swap/Send UX"
/>
<
FeatureFlagOption
flag=
{
FeatureFlags
.
MultichainExplore
}
label=
"Enable Multichain Explore Page"
/>
...
...
apps/web/src/components/Logo/ChainLogo.tsx
View file @
aa949db3
...
...
@@ -12,6 +12,7 @@ import {
ETHEREUM_LOGO
,
OPTIMISM_LOGO
,
POLYGON_LOGO
,
ZKSYNC_LOGO
,
ZORA_LOGO
,
}
from
'
ui/src/assets
'
...
...
@@ -104,6 +105,18 @@ export function getChainUI(chainId: ChainId, darkMode: boolean): ChainUI | undef
bgColor
:
'
rgba(65, 71, 148, 0.12)
'
,
textColor
:
'
#414794
'
,
}
case
ChainId
.
ZKSYNC
:
return
darkMode
?
{
symbol
:
ZKSYNC_LOGO
,
bgColor
:
'
rgba(97, 137, 255, 0.12)
'
,
textColor
:
'
#6189FF
'
,
}
:
{
symbol
:
ZKSYNC_LOGO
,
bgColor
:
'
rgba(54, 103, 246, 0.12)
'
,
textColor
:
'
#3667F6
'
,
}
default
:
return
undefined
}
...
...
apps/web/src/constants/chains.test.ts
View file @
aa949db3
...
...
@@ -41,6 +41,7 @@ const chainPriorityTestCases: [ChainId, number][] = [
[
ChainId
.
CELO_ALFAJORES
,
7
],
[
ChainId
.
BLAST
,
8
],
[
ChainId
.
ZORA
,
9
],
[
ChainId
.
ZKSYNC
,
10
],
]
test
.
each
(
chainPriorityTestCases
)(
...
...
@@ -68,6 +69,7 @@ const chainIdNames: { [chainId in SupportedInterfaceChainId]: string } = {
[
ChainId
.
BASE
]:
'
base
'
,
[
ChainId
.
BLAST
]:
'
blast
'
,
[
ChainId
.
ZORA
]:
'
zora
'
,
[
ChainId
.
ZKSYNC
]:
'
zksync
'
,
}
as
const
test
.
each
(
Object
.
keys
(
chainIdNames
).
map
((
key
)
=>
parseInt
(
key
)
as
SupportedInterfaceChainId
))(
...
...
@@ -138,6 +140,7 @@ const l2ChainIds = [
ChainId
.
BASE
,
ChainId
.
BLAST
,
ChainId
.
ZORA
,
ChainId
.
ZKSYNC
,
]
as
const
test
.
each
(
l2ChainIds
)(
'
L2_CHAIN_IDS generates the correct chainIds
'
,
(
chainId
:
SupportedInterfaceChainId
)
=>
{
...
...
@@ -156,6 +159,7 @@ const GQLMainnetChains = [
Chain
.
Base
,
Chain
.
Blast
,
Chain
.
Zora
,
Chain
.
Zksync
,
]
as
const
const
GQL_TESTNET_CHAINS
=
[
Chain
.
EthereumGoerli
,
Chain
.
EthereumSepolia
]
as
const
...
...
@@ -211,6 +215,7 @@ const chainToChainId = {
[
Chain
.
Base
]:
ChainId
.
BASE
,
[
Chain
.
Blast
]:
ChainId
.
BLAST
,
[
Chain
.
Zora
]:
ChainId
.
ZORA
,
[
Chain
.
Zksync
]:
ChainId
.
ZKSYNC
,
}
as
const
test
.
each
(
Object
.
keys
(
chainToChainId
).
map
((
key
)
=>
key
as
InterfaceGqlChain
))(
...
...
@@ -240,7 +245,7 @@ test.each(backendSupportedChains)(
}
)
const
backendNotyetSupportedChainIds
=
[
ChainId
.
AVALANCHE
,
ChainId
.
ZORA
]
as
const
const
backendNotyetSupportedChainIds
=
[
ChainId
.
AVALANCHE
,
ChainId
.
ZORA
,
ChainId
.
ZKSYNC
]
as
const
test
.
each
(
backendNotyetSupportedChainIds
)(
'
BACKEND_SUPPORTED_CHAINS generates the correct chains
'
,
...
...
@@ -278,6 +283,8 @@ function getBlocksPerMainnetEpochForChainId(chainId: number | undefined): number
switch
(
chainId
)
{
case
ChainId
.
ARBITRUM_ONE
:
return
46
case
ChainId
.
ZKSYNC
:
return
12
case
ChainId
.
OPTIMISM
:
return
6
case
ChainId
.
POLYGON
:
...
...
apps/web/src/constants/chains.ts
View file @
aa949db3
...
...
@@ -28,6 +28,7 @@ export const SUPPORTED_INTERFACE_CHAIN_IDS = [
ChainId
.
BASE
,
ChainId
.
BLAST
,
ChainId
.
ZORA
,
ChainId
.
ZKSYNC
,
]
as
const
export
function
isSupportedChainId
(
chainId
?:
number
|
ChainId
|
null
):
chainId
is
SupportedInterfaceChainId
{
...
...
@@ -41,11 +42,13 @@ function useFeatureFlaggedChainIds(): Partial<Record<SupportedInterfaceChainId,
// Example: [ChainId.BLAST]: useFeatureFlag(FeatureFlags.BLAST)
const
zoraEnabled
=
useFeatureFlag
(
FeatureFlags
.
Zora
)
const
zkSyncEnabled
=
useFeatureFlag
(
FeatureFlags
.
ZkSync
)
return
useMemo
(
()
=>
({
[
ChainId
.
ZORA
]:
zoraEnabled
,
[
ChainId
.
ZKSYNC
]:
zkSyncEnabled
,
}),
[
zoraEnabled
]
[
z
kSyncEnabled
,
z
oraEnabled
]
)
}
...
...
@@ -96,6 +99,7 @@ const POLYGON = UNIVERSE_CHAIN_INFO[UniverseChainId.Polygon]
const
POLYGON_MUMBAI
=
UNIVERSE_CHAIN_INFO
[
UniverseChainId
.
PolygonMumbai
]
const
SEPOLIA
=
UNIVERSE_CHAIN_INFO
[
UniverseChainId
.
SEPOLIA
]
const
ZORA
=
UNIVERSE_CHAIN_INFO
[
UniverseChainId
.
ZORA
]
const
ZKSYNC
=
UNIVERSE_CHAIN_INFO
[
UniverseChainId
.
ZKSYNC
]
const
INTERFACE_SUPPORTED_CHAINS
=
[
MAINNET
,
...
...
@@ -114,6 +118,7 @@ const INTERFACE_SUPPORTED_CHAINS = [
BASE
,
BLAST
,
ZORA
,
ZKSYNC
,
]
as
const
type
ExtractObject
<
TObject
extends
Record
<
string
,
unknown
>
,
TNarrowedObject
extends
Partial
<
TObject
>>
=
Extract
<
...
...
@@ -145,6 +150,7 @@ export const CHAIN_INFO: ChainInfoMap = {
[
ChainId
.
BASE
]:
BASE
,
[
ChainId
.
BLAST
]:
BLAST
,
[
ChainId
.
ZORA
]:
ZORA
,
[
ChainId
.
ZKSYNC
]:
ZKSYNC
,
}
as
const
export
type
ChainSlug
=
SupportedInterfaceChain
[
'
urlParam
'
]
...
...
apps/web/src/constants/lists.ts
View file @
aa949db3
// Lists we use as fallbacks on chains that our backend doesn't support
const
COINGECKO_AVAX_LIST
=
'
https://tokens.coingecko.com/avalanche/all.json
'
const
COINGECKO_ZKSYNC_LIST
=
'
https://tokens.coingecko.com/zksync/all.json
'
export
const
DEFAULT_INACTIVE_LIST_URLS
:
string
[]
=
[
COINGECKO_AVAX_LIST
]
export
const
DEFAULT_INACTIVE_LIST_URLS
:
string
[]
=
[
COINGECKO_AVAX_LIST
,
COINGECKO_ZKSYNC_LIST
]
apps/web/src/constants/routing.ts
View file @
aa949db3
import
{
ChainId
,
Currency
,
Token
,
WETH9
}
from
'
@uniswap/sdk-core
'
import
{
getNativeLogoURI
,
getTokenLogoURI
}
from
'
lib/hooks/useCurrencyLogoURIs
'
import
{
USDC_ZORA
}
from
'
uniswap/src/constants/tokens
'
import
{
SafetyLevel
}
from
'
uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks
'
import
{
CurrencyInfo
}
from
'
uniswap/src/features/dataApi/types
'
import
{
ARB
,
BTC_BSC
,
...
...
@@ -48,7 +44,11 @@ import {
WETH_POLYGON_MUMBAI
,
WRAPPED_NATIVE_CURRENCY
,
nativeOnChain
,
}
from
'
./tokens
'
}
from
'
constants/tokens
'
import
{
getNativeLogoURI
,
getTokenLogoURI
}
from
'
lib/hooks/useCurrencyLogoURIs
'
import
{
USDC_ZKSYNC
,
USDC_ZORA
}
from
'
uniswap/src/constants/tokens
'
import
{
SafetyLevel
}
from
'
uniswap/src/data/graphql/uniswap-data-api/__generated__/types-and-hooks
'
import
{
CurrencyInfo
}
from
'
uniswap/src/features/dataApi/types
'
type
ChainTokenList
=
{
readonly
[
chainId
:
number
]:
Token
[]
...
...
@@ -168,6 +168,10 @@ export const COMMON_BASES: ChainCurrencyList = {
[
ChainId
.
ZORA
]:
[
nativeOnChain
(
ChainId
.
ZORA
),
WRAPPED_NATIVE_CURRENCY
[
ChainId
.
ZORA
]
as
Token
,
USDC_ZORA
].
map
(
buildCurrencyInfo
),
[
ChainId
.
ZKSYNC
]:
[
nativeOnChain
(
ChainId
.
ZKSYNC
),
WRAPPED_NATIVE_CURRENCY
[
ChainId
.
ZKSYNC
]
as
Token
,
USDC_ZKSYNC
].
map
(
buildCurrencyInfo
),
}
// used to construct the list of all pairs we consider by default in the frontend
...
...
apps/web/src/constants/tokens.ts
View file @
aa949db3
...
...
@@ -343,6 +343,13 @@ export const WRAPPED_NATIVE_CURRENCY: { [chainId: number]: Token | undefined } =
),
[
ChainId
.
BLAST
]:
new
Token
(
ChainId
.
BLAST
,
'
0x4300000000000000000000000000000000000004
'
,
18
,
'
WETH
'
,
'
Wrapped Ether
'
),
[
ChainId
.
ZORA
]:
new
Token
(
ChainId
.
ZORA
,
'
0x4200000000000000000000000000000000000006
'
,
18
,
'
WETH
'
,
'
Wrapped Ether
'
),
[
ChainId
.
ZKSYNC
]:
new
Token
(
ChainId
.
ZKSYNC
,
'
0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91
'
,
18
,
'
WETH
'
,
'
Wrapped Ether
'
),
}
export
function
isCelo
(
chainId
:
number
):
chainId
is
ChainId
.
CELO
|
ChainId
.
CELO_ALFAJORES
{
...
...
apps/web/src/hooks/usePermit2Allowance.ts
View file @
aa949db3
import
{
PERMIT2_ADDRESS
}
from
'
@uniswap/permit2-sdk
'
import
{
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
CurrencyAmount
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
AVERAGE_L1_BLOCK_TIME
}
from
'
constants/chains
'
import
{
useAccount
}
from
'
hooks/useAccount
'
...
...
@@ -51,10 +51,14 @@ export default function usePermit2Allowance(
):
Allowance
{
const
account
=
useAccount
()
const
token
=
amount
?.
currency
const
{
tokenAllowance
,
isSyncing
:
isApprovalSyncing
}
=
useTokenAllowance
(
token
,
account
.
address
,
PERMIT2_ADDRESS
)
const
updateTokenAllowance
=
useUpdateTokenAllowance
(
amount
,
PERMIT2_ADDRESS
)
const
revokeTokenAllowance
=
useRevokeTokenAllowance
(
token
,
PERMIT2_ADDRESS
)
const
permit2AddressForChain
=
permit2Address
(
token
?.
chainId
)
const
{
tokenAllowance
,
isSyncing
:
isApprovalSyncing
}
=
useTokenAllowance
(
token
,
account
.
address
,
permit2AddressForChain
)
const
updateTokenAllowance
=
useUpdateTokenAllowance
(
amount
,
permit2AddressForChain
)
const
revokeTokenAllowance
=
useRevokeTokenAllowance
(
token
,
permit2AddressForChain
)
const
isApproved
=
useMemo
(()
=>
{
if
(
!
amount
||
!
tokenAllowance
)
{
return
false
...
...
@@ -67,8 +71,8 @@ export default function usePermit2Allowance(
// until it has been re-observed. It wll sync immediately, because confirmation fast-forwards the block number.
const
[
approvalState
,
setApprovalState
]
=
useState
(
ApprovalState
.
SYNCED
)
const
isApprovalLoading
=
approvalState
!==
ApprovalState
.
SYNCED
const
isApprovalPending
=
useHasPendingApproval
(
token
,
PERMIT2_ADDRESS
)
const
isRevocationPending
=
useHasPendingRevocation
(
token
,
PERMIT2_ADDRESS
)
const
isApprovalPending
=
useHasPendingApproval
(
token
,
permit2AddressForChain
)
const
isRevocationPending
=
useHasPendingRevocation
(
token
,
permit2AddressForChain
)
useEffect
(()
=>
{
if
(
isApprovalPending
)
{
...
...
apps/web/src/hooks/usePermitAllowance.ts
View file @
aa949db3
import
{
AllowanceTransfer
,
MaxAllowanceTransferAmount
,
P
ERMIT2_ADDRESS
,
PermitSingle
}
from
'
@uniswap/permit2-sdk
'
import
{
AllowanceTransfer
,
MaxAllowanceTransferAmount
,
P
ermitSingle
,
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
CurrencyAmount
,
Token
}
from
'
@uniswap/sdk-core
'
import
{
useAccount
}
from
'
hooks/useAccount
'
import
{
useContract
}
from
'
hooks/useContract
'
...
...
@@ -21,7 +21,7 @@ function toDeadline(expiration: number): number {
}
export
function
usePermitAllowance
(
token
?:
Token
,
owner
?:
string
,
spender
?:
string
)
{
const
contract
=
useContract
<
Permit2
>
(
PERMIT2_ADDRESS
,
PERMIT2_ABI
)
const
contract
=
useContract
<
Permit2
>
(
permit2Address
(
token
?.
chainId
)
,
PERMIT2_ABI
)
const
inputs
=
useMemo
(()
=>
[
owner
,
token
?.
address
,
spender
],
[
owner
,
spender
,
token
?.
address
])
// If there is no allowance yet, re-check next observed block.
...
...
@@ -94,7 +94,11 @@ export function useUpdatePermitAllowance(
sigDeadline
:
toDeadline
(
PERMIT_SIG_EXPIRATION
),
}
const
{
domain
,
types
,
values
}
=
AllowanceTransfer
.
getPermitData
(
permit
,
PERMIT2_ADDRESS
,
account
.
chainId
)
const
{
domain
,
types
,
values
}
=
AllowanceTransfer
.
getPermitData
(
permit
,
permit2Address
(
token
?.
chainId
),
account
.
chainId
)
const
signature
=
await
trace
.
child
({
name
:
'
Sign
'
,
op
:
'
wallet.sign
'
},
async
(
walletTrace
)
=>
{
try
{
return
await
signTypedData
(
signer
,
domain
,
types
,
values
)
...
...
apps/web/src/hooks/usePools.ts
View file @
aa949db3
...
...
@@ -23,7 +23,13 @@ class PoolCache {
private
static
pools
:
Pool
[]
=
[]
private
static
addresses
:
{
key
:
string
;
address
:
string
}[]
=
[]
static
getPoolAddress
(
factoryAddress
:
string
,
tokenA
:
Token
,
tokenB
:
Token
,
fee
:
FeeAmount
):
string
{
static
getPoolAddress
(
factoryAddress
:
string
,
tokenA
:
Token
,
tokenB
:
Token
,
fee
:
FeeAmount
,
chainId
:
ChainId
):
string
{
if
(
this
.
addresses
.
length
>
this
.
MAX_ENTRIES
)
{
this
.
addresses
=
this
.
addresses
.
slice
(
0
,
this
.
MAX_ENTRIES
/
2
)
}
...
...
@@ -43,6 +49,7 @@ class PoolCache {
tokenA
,
tokenB
,
fee
,
chainId
,
}),
}
this
.
addresses
.
unshift
(
address
)
...
...
@@ -117,7 +124,7 @@ export function usePools(
return
new
Array
(
poolTokens
.
length
)
}
return
poolTokens
.
map
((
value
)
=>
value
&&
PoolCache
.
getPoolAddress
(
v3CoreFactoryAddress
,
...
value
))
return
poolTokens
.
map
((
value
)
=>
value
&&
PoolCache
.
getPoolAddress
(
v3CoreFactoryAddress
,
...
value
,
chainId
))
},
[
chainId
,
poolTokens
])
const
slot0s
=
useMultipleContractSingleData
(
poolAddresses
,
POOL_STATE_INTERFACE
,
'
slot0
'
)
...
...
@@ -198,7 +205,7 @@ export function usePoolMultichain(
const
poolData
=
useRef
<
[
PoolState
,
Pool
|
null
]
>
([
PoolState
.
LOADING
,
null
])
const
poolAddress
=
tokenA
&&
tokenB
&&
fee
?
PoolCache
.
getPoolAddress
(
V3_CORE_FACTORY_ADDRESSES
[
chainId
],
tokenA
,
tokenB
,
fee
)
?
PoolCache
.
getPoolAddress
(
V3_CORE_FACTORY_ADDRESSES
[
chainId
],
tokenA
,
tokenB
,
fee
,
chainId
)
:
undefined
const
contractMap
=
useMemo
(()
=>
(
poolAddress
?
{
[
chainId
]:
poolAddress
}
:
{}),
[
chainId
,
poolAddress
])
...
...
apps/web/src/state/routing/gas.ts
View file @
aa949db3
import
{
MaxUint256
,
PERMIT2_ADDRESS
}
from
'
@uniswap/permit2-sdk
'
import
{
MaxUint256
,
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
ChainId
,
Currency
}
from
'
@uniswap/sdk-core
'
import
{
SupportedInterfaceChainId
}
from
'
constants/chains
'
import
{
RPC_PROVIDERS
}
from
'
constants/providers
'
...
...
@@ -41,7 +41,7 @@ export async function getApproveInfo(
let
approveGasUseEstimate
try
{
const
allowance
=
await
tokenContract
.
callStatic
.
allowance
(
account
,
PERMIT2_ADDRESS
)
const
allowance
=
await
tokenContract
.
callStatic
.
allowance
(
account
,
permit2Address
(
currency
.
chainId
)
)
if
(
allowance
.
gte
(
amount
))
{
return
{
needsApprove
:
false
}
}
...
...
@@ -51,7 +51,7 @@ export async function getApproveInfo(
}
try
{
const
approveTx
=
await
tokenContract
.
populateTransaction
.
approve
(
PERMIT2_ADDRESS
,
MaxUint256
)
const
approveTx
=
await
tokenContract
.
populateTransaction
.
approve
(
permit2Address
(
currency
.
chainId
)
,
MaxUint256
)
approveGasUseEstimate
=
(
await
provider
.
estimateGas
({
from
:
account
,
...
approveTx
})).
toNumber
()
}
catch
(
_
)
{
// estimateGas will error if the account doesn't have sufficient token balance, but we should show an estimated cost anyway
...
...
apps/web/src/state/transactions/hooks.test.tsx
View file @
aa949db3
import
{
BigNumber
}
from
'
@ethersproject/bignumber
'
import
{
PERMIT2_ADDRESS
}
from
'
@uniswap/permit2-sdk
'
import
{
permit2Address
}
from
'
@uniswap/permit2-sdk
'
import
{
ChainId
}
from
'
@uniswap/sdk-core
'
import
{
USDC_MAINNET
}
from
'
constants/tokens
'
import
{
useAccount
}
from
'
hooks/useAccount
'
...
...
@@ -17,6 +17,8 @@ import {
import
{
clearAllTransactions
,
finalizeTransaction
}
from
'
./reducer
'
import
{
ApproveTransactionInfo
,
TransactionInfo
,
TransactionType
}
from
'
./types
'
const
PERMIT2_ADDRESS_MAINNET
=
permit2Address
(
ChainId
.
MAINNET
)
const
pendingTransactionResponse
=
{
hash
:
'
0x123
'
,
timestamp
:
1000
,
...
...
@@ -35,7 +37,7 @@ const pendingTransactionResponse = {
const
mockApprovalTransactionInfo
:
ApproveTransactionInfo
=
{
type
:
TransactionType
.
APPROVAL
,
tokenAddress
:
USDC_MAINNET
.
address
,
spender
:
PERMIT2_ADDRESS
,
spender
:
PERMIT2_ADDRESS
_MAINNET
,
amount
:
'
10000
'
,
}
...
...
@@ -105,7 +107,7 @@ describe('Transactions hooks', () => {
describe
(
'
useHasPendingApproval
'
,
()
=>
{
it
(
'
returns true when there is a pending transaction
'
,
()
=>
{
addPendingTransaction
(
mockApprovalTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
true
)
})
...
...
@@ -113,31 +115,31 @@ describe('Transactions hooks', () => {
addPendingTransaction
({
type
:
TransactionType
.
SUBMIT_PROPOSAL
,
})
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a pending approval but it is not for the current chain
'
,
()
=>
{
mocked
(
useAccount
).
mockReturnValue
({
chainId
:
ChainId
.
BASE
}
as
ReturnType
<
typeof
useAccount
>
)
addPendingTransaction
(
mockApprovalTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a confirmed approval transaction
'
,
()
=>
{
addConfirmedTransaction
(
mockApprovalTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there are no pending transactions
'
,
()
=>
{
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a pending revocation
'
,
()
=>
{
addPendingTransaction
(
mockRevocationTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingApproval
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
})
...
...
@@ -145,7 +147,7 @@ describe('Transactions hooks', () => {
describe
(
'
useHasPendingRevocation
'
,
()
=>
{
it
(
'
returns true when there is a pending revocation
'
,
()
=>
{
addPendingTransaction
(
mockRevocationTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
true
)
})
...
...
@@ -153,31 +155,31 @@ describe('Transactions hooks', () => {
addPendingTransaction
({
type
:
TransactionType
.
SUBMIT_PROPOSAL
,
})
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a pending revocation but it is not for the current chain
'
,
()
=>
{
mocked
(
useAccount
).
mockReturnValue
({
chainId
:
ChainId
.
BASE
}
as
ReturnType
<
typeof
useAccount
>
)
addPendingTransaction
(
mockRevocationTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a confirmed approval transaction
'
,
()
=>
{
addConfirmedTransaction
(
mockRevocationTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there are no pending transactions
'
,
()
=>
{
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
it
(
'
returns false when there is a pending approval
'
,
()
=>
{
addPendingTransaction
(
mockApprovalTransactionInfo
)
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
))
const
{
result
}
=
renderHook
(()
=>
useHasPendingRevocation
(
USDC_MAINNET
,
PERMIT2_ADDRESS
_MAINNET
))
expect
(
result
.
current
).
toBe
(
false
)
})
})
...
...
apps/web/src/utils/getExplorerLink.ts
View file @
aa949db3
...
...
@@ -17,6 +17,7 @@ const BLOCK_EXPLORER_PREFIXES: { [chainId: number]: string } = {
[
ChainId
.
BASE
]:
'
https://basescan.org
'
,
[
ChainId
.
BLAST
]:
'
https://blastscan.io
'
,
[
ChainId
.
ZORA
]:
'
https://zora.superscan.network
'
,
[
ChainId
.
ZKSYNC
]:
'
https://explorer.zksync.io
'
,
}
export
enum
ExplorerDataType
{
...
...
package.json
View file @
aa949db3
...
...
@@ -37,10 +37,10 @@
"@babel/preset-env"
:
"7.23.3"
,
"immer"
:
"9.0.21"
,
"@uniswap/v2-sdk"
:
"4.3.2"
,
"@uniswap/v3-sdk"
:
"3.1
1.2
"
,
"@uniswap/v3-sdk"
:
"3.1
3.0
"
,
"@uniswap/router-sdk"
:
"1.9.2"
,
"@apollo/client"
:
"3.10.4"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"@react-navigation/routers"
:
"6.1.9"
,
"@react-navigation/core"
:
"6.2.2"
,
"@sideway/formula"
:
"3.0.1"
,
...
...
packages/ui/src/assets/index.ts
View file @
aa949db3
...
...
@@ -8,6 +8,7 @@ export const BLAST_LOGO = require('./logos/png/blast-logo.png')
export
const
AVALANCHE_LOGO
=
require
(
'
./logos/png/avalanche-logo.png
'
)
export
const
CELO_LOGO
=
require
(
'
./logos/png/celo-logo.png
'
)
export
const
ZORA_LOGO
=
require
(
'
./logos/png/zora-logo.png
'
)
export
const
ZKSYNC_LOGO
=
require
(
'
./logos/png/zksync-logo.png
'
)
export
const
GOERLI_LOGO
=
require
(
'
./logos/png/goerli-logo.png
'
)
export
const
MUMBAI_LOGO
=
require
(
'
./logos/png/mumbai-logo.png
'
)
export
const
UNISWAP_LOGO
=
require
(
'
./logos/png/uniswap-logo.png
'
)
...
...
packages/ui/src/assets/logos/png/zksync-logo.png
0 → 100644
View file @
aa949db3
1.21 KB
packages/uniswap/package.json
View file @
aa949db3
...
...
@@ -24,7 +24,7 @@
"@typechain/ethers-v5"
:
"7.2.0"
,
"@uniswap/analytics-events"
:
"2.32.0"
,
"@uniswap/router-sdk"
:
"1.9.2"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"apollo-link-rest"
:
"0.9.0"
,
"ethers"
:
"5.7.2"
,
"i18next"
:
"23.10.0"
,
...
...
packages/uniswap/src/config.ts
View file @
aa949db3
...
...
@@ -41,6 +41,7 @@ export interface Config {
quicknodeArbitrumRpcUrl
:
string
quicknodeBnbRpcUrl
:
string
quicknodeZoraRpcUrl
:
string
quicknodeZkSyncRpcUrl
:
string
quicknodeMainnetRpcUrl
:
string
tradingApiKey
:
string
firebaseAppCheckDebugToken
:
string
...
...
@@ -71,6 +72,7 @@ const _config: Config = {
process
.
env
.
REACT_APP_QUICKNODE_ARBITRUM_RPC_URL
||
QUICKNODE_ARBITRUM_RPC_URL
,
quicknodeBnbRpcUrl
:
process
.
env
.
QUICKNODE_BNB_RPC_URL
||
QUICKNODE_BNB_RPC_URL
,
quicknodeZoraRpcUrl
:
process
.
env
.
QUICKNODE_ZORA_RPC_URL
||
QUICKNODE_ZORA_RPC_URL
,
quicknodeZkSyncRpcUrl
:
process
.
env
.
QUICKNODE_ZKSYNC_RPC_URL
||
''
,
quicknodeMainnetRpcUrl
:
process
.
env
.
REACT_APP_QUICKNODE_MAINNET_RPC_URL
||
QUICKNODE_MAINNET_RPC_URL
,
tradingApiKey
:
process
.
env
.
TRADING_API_KEY
||
TRADING_API_KEY
,
...
...
packages/uniswap/src/constants/chains.ts
View file @
aa949db3
...
...
@@ -11,6 +11,7 @@ import {
MUMBAI_LOGO
,
OPTIMISM_LOGO
,
POLYGON_LOGO
,
ZKSYNC_LOGO
,
ZORA_LOGO
,
}
from
'
ui/src/assets
'
import
{
...
...
@@ -46,6 +47,7 @@ import {
USDC_POLYGON
,
USDC_POLYGON_MUMBAI
,
USDC_SEPOLIA
,
USDC_ZKSYNC
,
USDC_ZORA
,
USDT
,
USDT_BSC
,
...
...
@@ -78,6 +80,7 @@ import {
polygon
,
polygonMumbai
,
sepolia
,
zkSync
,
zora
,
}
from
'
wagmi/chains
'
...
...
@@ -982,7 +985,7 @@ export const UNIVERSE_CHAIN_INFO = {
appOnly
:
{
http
:
[
config
.
quicknodeZoraRpcUrl
]
},
},
spotPriceStablecoinAmount
:
CurrencyAmount
.
fromRawAmount
(
USDC_ZORA
,
10
_000e6
),
stablecoins
:
[],
stablecoins
:
[
USDC_ZORA
],
statusPage
:
undefined
,
supportsClientSideRouting
:
false
,
supportsGasEstimates
:
true
,
...
...
@@ -994,4 +997,58 @@ export const UNIVERSE_CHAIN_INFO = {
address
:
'
0x4200000000000000000000000000000000000006
'
,
},
}
as
const
satisfies
UniverseChainInfo
,
[
UniverseChainId
.
ZKSYNC
]:
{
...
zkSync
,
id
:
UniverseChainId
.
ZKSYNC
,
assetRepoNetworkName
:
'
zksync
'
,
backendChain
:
{
chain
:
BackendChainId
.
Zksync
as
InterfaceGqlChain
,
backendSupported
:
false
,
isSecondaryChain
:
false
,
nativeTokenBackendAddress
:
undefined
,
},
blockPerMainnetEpochForChainId
:
12
,
blockWaitMsBeforeWarning
:
600000
,
bridge
:
'
https://portal.zksync.io/bridge/
'
,
chainPriority
:
10
,
docs
:
'
https://docs.zksync.io/
'
,
elementName
:
ElementName
.
ChainZkSync
,
explorer
:
{
name
:
'
ZKsync Explorer
'
,
url
:
'
https://explorer.zksync.io/
'
,
logoLight
:
EtherscanLogoLight
,
logoDark
:
EtherscanLogoDark
,
},
helpCenterUrl
:
undefined
,
infoLink
:
'
https://app.uniswap.org/explore/tokens/zksync
'
,
infuraPrefix
:
undefined
,
interfaceName
:
'
zksync
'
,
label
:
'
ZKsync
'
,
logo
:
ZKSYNC_LOGO
,
nativeCurrency
:
{
name
:
'
ZKsync ETH
'
,
symbol
:
'
ETH
'
,
decimals
:
18
,
address
:
DEFAULT_NATIVE_ADDRESS
,
},
networkLayer
:
NetworkLayer
.
L2
,
pendingTransactionsRetryOptions
:
undefined
,
rpcUrls
:
{
[
RPCType
.
Public
]:
{
http
:
[
config
.
quicknodeZkSyncRpcUrl
]
},
default
:
{
http
:
[
'
https://mainnet.era.zksync.io/
'
]
},
appOnly
:
{
http
:
[
config
.
quicknodeZkSyncRpcUrl
]
},
},
urlParam
:
'
zksync
'
,
statusPage
:
undefined
,
spotPriceStablecoinAmount
:
CurrencyAmount
.
fromRawAmount
(
USDC_ZKSYNC
,
10
_000e6
),
stablecoins
:
[
USDC_ZKSYNC
],
supportsClientSideRouting
:
false
,
supportsGasEstimates
:
false
,
wrappedNativeCurrency
:
{
name
:
'
Wrapped Ether
'
,
symbol
:
'
WETH
'
,
decimals
:
18
,
address
:
'
0x000000000000000000000000000000000000800A
'
,
},
}
as
const
satisfies
UniverseChainInfo
,
}
packages/uniswap/src/constants/tokens.ts
View file @
aa949db3
...
...
@@ -180,3 +180,10 @@ export const USDC_ZORA = new Token(
'
USDC
'
,
'
USD Coin
'
)
export
const
USDC_ZKSYNC
=
new
Token
(
UniverseChainId
.
ZKSYNC
,
'
0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4
'
,
6
,
'
USDC
'
,
'
USD Coin
'
)
packages/uniswap/src/data/graphql/uniswap-data-api/schema.graphql
View file @
aa949db3
...
...
@@ -183,6 +183,7 @@ enum Chain {
BASE
BLAST
ZORA
ZKSYNC
UNKNOWN_CHAIN
}
...
...
packages/uniswap/src/features/gating/flags.ts
View file @
aa949db3
...
...
@@ -47,6 +47,7 @@ export enum FeatureFlags {
V2Everywhere
,
V2Explore
,
Zora
,
ZkSync
,
// TODO(WEB-3625): Remove these once we have a generalized system for outage banners.
OutageBannerArbitrum
,
OutageBannerOptimism
,
...
...
@@ -76,6 +77,7 @@ export const WEB_FEATURE_FLAG_NAMES = new Map<FeatureFlags, string>([
[
FeatureFlags
.
V2Everywhere
,
'
v2_everywhere
'
],
[
FeatureFlags
.
V2Explore
,
'
v2_explore
'
],
[
FeatureFlags
.
Zora
,
'
zora
'
],
[
FeatureFlags
.
ZkSync
,
'
zksync
'
],
// TODO(WEB-3625): Remove these once we have a generalized system for outage banners.
[
FeatureFlags
.
OutageBannerArbitrum
,
'
outage_banner_feb_2024_arbitrum
'
],
[
FeatureFlags
.
OutageBannerOptimism
,
'
outage_banner_feb_2024_optimism
'
],
...
...
packages/uniswap/src/features/telemetry/constants/trace.ts
View file @
aa949db3
...
...
@@ -109,6 +109,7 @@ export const ElementName = {
ChainBase
:
'
chain-base
'
,
ChainBlast
:
'
chain-blast
'
,
ChainZora
:
'
chain-zora
'
,
ChainZkSync
:
'
chain-zksync
'
,
ChooseInputToken
:
'
choose-input-token
'
,
ChooseOutputToken
:
'
choose-output-token
'
,
Confirm
:
'
confirm
'
,
...
...
packages/utilities/package.json
View file @
aa949db3
...
...
@@ -17,7 +17,7 @@
"@sentry/react-native"
:
"5.5.0"
,
"@uniswap/analytics"
:
"1.7.0"
,
"@uniswap/analytics-events"
:
"2.32.0"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"aws-appsync-auth-link"
:
"3.0.7"
,
"aws-appsync-subscription-link"
:
"3.1.3"
,
"dayjs"
:
"1.11.7"
,
...
...
packages/wallet/package.json
View file @
aa949db3
...
...
@@ -26,12 +26,12 @@
"@sentry/types"
:
"7.80.0"
,
"@shopify/flash-list"
:
"1.6.3"
,
"@uniswap/analytics-events"
:
"2.32.0"
,
"@uniswap/permit2-sdk"
:
"1.
2.1
"
,
"@uniswap/permit2-sdk"
:
"1.
3.0
"
,
"@uniswap/router-sdk"
:
"1.9.2"
,
"@uniswap/sdk-core"
:
"5.
0
.0"
,
"@uniswap/universal-router-sdk"
:
"2.
1
.0"
,
"@uniswap/sdk-core"
:
"5.
3
.0"
,
"@uniswap/universal-router-sdk"
:
"2.
2
.0"
,
"@uniswap/v2-sdk"
:
"4.3.2"
,
"@uniswap/v3-sdk"
:
"3.1
1.2
"
,
"@uniswap/v3-sdk"
:
"3.1
3.0
"
,
"apollo-link-rest"
:
"0.9.0"
,
"apollo3-cache-persist"
:
"0.14.1"
,
"axios"
:
"1.6.5"
,
...
...
packages/wallet/src/features/transactions/swap/usePermit2Signature.ts
View file @
aa949db3
...
...
@@ -2,13 +2,13 @@ import {
AllowanceProvider
,
AllowanceTransfer
,
MaxUint160
,
PERMIT2_ADDRESS
,
permit2Address
,
PermitSingle
,
}
from
'
@uniswap/permit2-sdk
'
import
{
Currency
,
CurrencyAmount
}
from
'
@uniswap/sdk-core
'
import
{
UNIVERSAL_ROUTER_ADDRESS
}
from
'
@uniswap/universal-router-sdk
'
import
dayjs
from
'
dayjs
'
import
{
BigNumber
,
TypedDataField
,
providers
}
from
'
ethers
'
import
{
BigNumber
,
providers
,
TypedDataField
}
from
'
ethers
'
import
{
useCallback
}
from
'
react
'
import
{
ChainId
}
from
'
uniswap/src/types/chains
'
import
{
logger
}
from
'
utilities/src/logger/logger
'
...
...
@@ -69,7 +69,7 @@ async function getPermit2PermitSignature(
}
const
user
=
account
.
address
const
allowanceProvider
=
new
AllowanceProvider
(
provider
,
PERMIT2_ADDRESS
)
const
allowanceProvider
=
new
AllowanceProvider
(
provider
,
permit2Address
(
chainId
)
)
const
universalRouterAddress
=
UNIVERSAL_ROUTER_ADDRESS
(
chainId
)
const
{
amount
:
permitAmount
,
...
...
@@ -84,7 +84,7 @@ async function getPermit2PermitSignature(
const
permitMessage
=
getPermitStruct
(
tokenAddress
,
nonce
,
universalRouterAddress
)
const
{
domain
,
types
,
values
}
=
AllowanceTransfer
.
getPermitData
(
permitMessage
,
PERMIT2_ADDRESS
,
permit2Address
(
chainId
)
,
chainId
)
...
...
yarn.lock
View file @
aa949db3
...
...
@@ -13583,20 +13583,20 @@ __metadata:
"@uniswap/governance": 1.0.2
"@uniswap/liquidity-staker": 1.0.2
"@uniswap/merkle-distributor": 1.0.1
"@uniswap/permit2-sdk": 1.
2.1
"@uniswap/permit2-sdk": 1.
3.0
"@uniswap/redux-multicall": 1.1.8
"@uniswap/router-sdk": 1.9.2
"@uniswap/sdk-core": 5.
0
.0
"@uniswap/sdk-core": 5.
3
.0
"@uniswap/smart-order-router": 3.17.3
"@uniswap/token-lists": 1.0.0-beta.33
"@uniswap/uniswapx-sdk": 2.0.4-alpha.1
"@uniswap/universal-router-sdk": 2.
1
.0
"@uniswap/universal-router-sdk": 2.
2
.0
"@uniswap/v2-core": 1.0.1
"@uniswap/v2-periphery": 1.1.0-beta.0
"@uniswap/v2-sdk": 4.3.2
"@uniswap/v3-core": 1.0.1
"@uniswap/v3-periphery": 1.4.4
"@uniswap/v3-sdk": 3.1
1.2
"@uniswap/v3-sdk": 3.1
3.0
"@vanilla-extract/css": 1.14.0
"@vanilla-extract/dynamic": 2.1.0
"@vanilla-extract/jest-transform": 1.1.1
...
...
@@ -13807,8 +13807,8 @@ __metadata:
"@uniswap/analytics-events": 2.32.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/ethers-rs-mobile": 0.0.5
"@uniswap/sdk-core": 5.
0
.0
"@uniswap/v3-sdk": 3.1
1.2
"@uniswap/sdk-core": 5.
3
.0
"@uniswap/v3-sdk": 3.1
3.0
"@walletconnect/core": 2.11.2
"@walletconnect/react-native-compat": 2.11.2
"@walletconnect/types": 2.11.2
...
...
@@ -13906,13 +13906,13 @@ __metadata:
languageName: unknown
linkType: soft
"@uniswap/permit2-sdk@npm:1.
2.1, @uniswap/permit2-sdk@npm:^1.2.0, @uniswap/permit2-sdk@npm:^1.2.1
":
version: 1.
2.1
resolution: "@uniswap/permit2-sdk@npm:1.
2.1
"
"@uniswap/permit2-sdk@npm:1.
3.0, @uniswap/permit2-sdk@npm:^1.2.0, @uniswap/permit2-sdk@npm:^1.2.1, @uniswap/permit2-sdk@npm:^1.3.0
":
version: 1.
3.0
resolution: "@uniswap/permit2-sdk@npm:1.
3.0
"
dependencies:
ethers: ^5.7.0
tiny-invariant: ^1.1.0
checksum:
7c4fcc0aaa6e53da0f01c25984b7b37aaf95aa43479a2f374d5867956033ed34d9477b31aa1c0998c51ae3af28ab5dd2902c97f2acd176dac6dfed171ca5b6a4
checksum:
828a63c52673a5b4eefa769c0ecc2da667fe5573a3c447d0fea3809b46e7a71376a48917d959f253abba01e9faa442a503dd65649687a6bf7b385ee9f6d41afd
languageName: node
linkType: hard
...
...
@@ -13943,17 +13943,20 @@ __metadata:
languageName: node
linkType: hard
"@uniswap/sdk-core@npm:5.
0
.0":
version: 5.
0
.0
resolution: "@uniswap/sdk-core@npm:5.
0
.0"
"@uniswap/sdk-core@npm:5.
3
.0":
version: 5.
3
.0
resolution: "@uniswap/sdk-core@npm:5.
3
.0"
dependencies:
"@ethersproject/address": ^5.0.2
"@ethersproject/bytes": ^5.7.0
"@ethersproject/keccak256": 5.7.0
"@ethersproject/strings": 5.7.0
big.js: ^5.2.2
decimal.js-light: ^2.5.0
jsbi: ^3.1.4
tiny-invariant: ^1.1.0
toformat: ^2.0.0
checksum:
06a4b9ccec3e19bdf695011999c4039a0477910ad5e4128efd8a06e44c23fb40d3685ef5ef2d520632562fe4d0fa486d01326b391266e8e08f43dfc522bd41d5
checksum:
82570af027937c998208f8ea0bb8c44bd8a2e541023f3b6a5115d9298c95c5f37b20b892ccedf6cc6582ab01f5683f4a8c078cccac43565a5da3362b7363cee7
languageName: node
linkType: hard
...
...
@@ -14014,8 +14017,8 @@ __metadata:
"@types/ua-parser-js": 0.7.31
"@types/uuid": 9.0.1
"@uniswap/eslint-config": "workspace:^"
"@uniswap/universal-router-sdk": 2.
1
.0
"@uniswap/v3-sdk": 3.1
1.2
"@uniswap/universal-router-sdk": 2.
2
.0
"@uniswap/v3-sdk": 3.1
3.0
"@welldone-software/why-did-you-render": 8.0.1
clean-webpack-plugin: ^4.0.0
copy-webpack-plugin: ^11.0.0
...
...
@@ -14101,19 +14104,19 @@ __metadata:
languageName: node
linkType: hard
"@uniswap/universal-router-sdk@npm:2.
1
.0":
version: 2.
1
.0
resolution: "@uniswap/universal-router-sdk@npm:2.
1
.0"
"@uniswap/universal-router-sdk@npm:2.
2
.0":
version: 2.
2
.0
resolution: "@uniswap/universal-router-sdk@npm:2.
2
.0"
dependencies:
"@uniswap/permit2-sdk": ^1.
2.1
"@uniswap/permit2-sdk": ^1.
3.0
"@uniswap/router-sdk": ^1.9.2
"@uniswap/sdk-core": ^5.
0
.0
"@uniswap/sdk-core": ^5.
3
.0
"@uniswap/universal-router": 1.6.0
"@uniswap/v2-sdk": ^4.3.2
"@uniswap/v3-sdk": ^3.1
1.2
"@uniswap/v3-sdk": ^3.1
3.0
bignumber.js: ^9.0.2
ethers: ^5.7.0
checksum:
dbce6f15b4d58120d1d602d6f68bcdf46a4e91fa7118ef75aa7f6932a1efcb07353135337e54805e110c1c21a3f91d37bf626949f860e35f62ffac475f19506c
checksum:
8b2863ff867913606ee660610a9e7489d58c07531de6b9062b623a5290a0364ffac15997e2fcd613e7b4b280297b1d667496a2ae41bc3c1f5bbc0ab83944d471
languageName: node
linkType: hard
...
...
@@ -14208,19 +14211,19 @@ __metadata:
languageName: node
linkType: hard
"@uniswap/v3-sdk@npm:3.1
1.2
":
version: 3.1
1.2
resolution: "@uniswap/v3-sdk@npm:3.1
1.2
"
"@uniswap/v3-sdk@npm:3.1
3.0
":
version: 3.1
3.0
resolution: "@uniswap/v3-sdk@npm:3.1
3.0
"
dependencies:
"@ethersproject/abi": ^5.5.0
"@ethersproject/solidity": ^5.0.9
"@uniswap/sdk-core": ^5.
0
.0
"@uniswap/sdk-core": ^5.
3
.0
"@uniswap/swap-router-contracts": ^1.3.0
"@uniswap/v3-periphery": ^1.1.1
"@uniswap/v3-staker": 1.0.0
tiny-invariant: ^1.1.0
tiny-warning: ^1.0.3
checksum:
82092b239b482b8fd9fd21afdcc4cf9860315af4c524e100a7ac02d25aba0bf25ad1aaf12d97105874590bad97eed4ff2f95dd56e849f881596ac32148cce726
checksum:
b1eebd0a0fd11ea6f71edb76a1c604f80bd0401461bbadb8164dd0cfbb24ec524a9194ae8dc6a7f3c1a38c71d23d3c35ff9a7c8a4aae1ed64e53a5098932fe0e
languageName: node
linkType: hard
...
...
@@ -42646,7 +42649,7 @@ __metadata:
"@uniswap/analytics-events": 2.32.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/router-sdk": 1.9.2
"@uniswap/sdk-core": 5.
0
.0
"@uniswap/sdk-core": 5.
3
.0
apollo-link-rest: 0.9.0
depcheck: 1.4.7
eslint: 8.44.0
...
...
@@ -43147,7 +43150,7 @@ __metadata:
"@uniswap/analytics": 1.7.0
"@uniswap/analytics-events": 2.32.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/sdk-core": 5.
0
.0
"@uniswap/sdk-core": 5.
3
.0
aws-appsync-auth-link: 3.0.7
aws-appsync-subscription-link: 3.1.3
dayjs: 1.11.7
...
...
@@ -43688,12 +43691,12 @@ __metadata:
"@types/zxcvbn": 4.4.2
"@uniswap/analytics-events": 2.32.0
"@uniswap/eslint-config": "workspace:^"
"@uniswap/permit2-sdk": 1.
2.1
"@uniswap/permit2-sdk": 1.
3.0
"@uniswap/router-sdk": 1.9.2
"@uniswap/sdk-core": 5.
0
.0
"@uniswap/universal-router-sdk": 2.
1
.0
"@uniswap/sdk-core": 5.
3
.0
"@uniswap/universal-router-sdk": 2.
2
.0
"@uniswap/v2-sdk": 4.3.2
"@uniswap/v3-sdk": 3.1
1.2
"@uniswap/v3-sdk": 3.1
3.0
apollo-link-rest: 0.9.0
apollo3-cache-persist: 0.14.1
axios: 1.6.5
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