ci(release): publish latest release

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