ci(release): publish latest release

parent 1d59f92a
IPFS hash of the deployment:
- CIDv0: `QmU2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH`
- CIDv1: `bafybeicususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi`
- CIDv0: `QmWqSfbLDY22q6duTWFocMGoy317SVW13YLpc1yrkrHoeJ`
- CIDv1: `bafybeid6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm`
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://bafybeicususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi.ipfs.dweb.link/
- https://bafybeicususuyvytbxxpmjbk7ustwesnzwekzn4fs3argdhmr3d3p2t2mi.ipfs.cf-ipfs.com/
- [ipfs://QmU2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH/](ipfs://QmU2prusDiAfiySsHU8tcVbFwcrvSXdEDBVbvyzkpYKEUH/)
- https://bafybeid6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm.ipfs.dweb.link/
- https://bafybeid6hw4k6jbgyrrwnqtzrgszxdpwotrphjy2nys4mssjakpzbsbztm.ipfs.cf-ipfs.com/
- [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
\ No newline at end of file
web/5.35.0
\ No newline at end of file
......@@ -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.11.2",
"@uniswap/sdk-core": "5.3.0",
"@uniswap/v3-sdk": "3.13.0",
"@walletconnect/core": "2.11.2",
"@walletconnect/react-native-compat": "2.11.2",
"@walletconnect/utils": "2.11.2",
......
......@@ -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"
......
......@@ -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 ''
}
......
......@@ -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.11.2",
"@uniswap/v3-sdk": "3.13.0",
"@vanilla-extract/css": "1.14.0",
"@vanilla-extract/dynamic": "2.1.0",
"@vanilla-extract/sprinkles": "1.6.1",
......
......@@ -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",
......
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'
......
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 ||
......
......@@ -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])
......
......@@ -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" />
<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" />
......
......@@ -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
}
......
......@@ -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:
......
......@@ -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]
[zkSyncEnabled, zoraEnabled]
)
}
......@@ -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']
......
// 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]
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
......
......@@ -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 {
......
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) {
......
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 { 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)
......
......@@ -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])
......
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
......
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)
})
})
......
......@@ -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 {
......
......@@ -37,10 +37,10 @@
"@babel/preset-env": "7.23.3",
"immer": "9.0.21",
"@uniswap/v2-sdk": "4.3.2",
"@uniswap/v3-sdk": "3.11.2",
"@uniswap/v3-sdk": "3.13.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",
......
......@@ -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')
......
......@@ -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",
......
......@@ -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,
......
......@@ -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,
}
......@@ -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'
)
......@@ -183,6 +183,7 @@ enum Chain {
BASE
BLAST
ZORA
ZKSYNC
UNKNOWN_CHAIN
}
......
......@@ -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'],
......
......@@ -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',
......
......@@ -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",
......
......@@ -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.11.2",
"@uniswap/v3-sdk": "3.13.0",
"apollo-link-rest": "0.9.0",
"apollo3-cache-persist": "0.14.1",
"axios": "1.6.5",
......
......@@ -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
)
......
......@@ -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.11.2
"@uniswap/v3-sdk": 3.13.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.11.2
"@uniswap/sdk-core": 5.3.0
"@uniswap/v3-sdk": 3.13.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.11.2
"@uniswap/universal-router-sdk": 2.2.0
"@uniswap/v3-sdk": 3.13.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.11.2
"@uniswap/v3-sdk": ^3.13.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.11.2":
version: 3.11.2
resolution: "@uniswap/v3-sdk@npm:3.11.2"
"@uniswap/v3-sdk@npm:3.13.0":
version: 3.13.0
resolution: "@uniswap/v3-sdk@npm:3.13.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.11.2
"@uniswap/v3-sdk": 3.13.0
apollo-link-rest: 0.9.0
apollo3-cache-persist: 0.14.1
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