diff --git a/package.json b/package.json index ac0c128a..7cb3d2ba 100644 --- a/package.json +++ b/package.json @@ -230,6 +230,8 @@ "@web3-react/walletconnect-v2": "^8.5.1", "ajv": "^8.11.0", "ajv-formats": "^2.1.1", + "apollo-cache-inmemory": "^1.6.6", + "apollo-link-http": "^1.5.17", "array.prototype.flat": "^1.2.4", "array.prototype.flatmap": "^1.2.4", "cids": "^1.0.0", @@ -263,6 +265,7 @@ "qs": "^6.9.4", "rc-slider": "^10.0.1", "react": "^18.2.0", + "react-apollo": "^3.1.5", "react-dom": "^18.2.0", "react-feather": "^2.0.8", "react-helmet": "^6.1.0", diff --git a/src/apollo/client.js b/src/apollo/client.js new file mode 100644 index 00000000..02a8998a --- /dev/null +++ b/src/apollo/client.js @@ -0,0 +1,35 @@ +import { ApolloClient } from '@apollo/client' +import { InMemoryCache } from 'apollo-cache-inmemory' +import { HttpLink } from 'apollo-link-http' +import { getApiUrl } from 'constants/tokens' + +export const jediSwapClient = new ApolloClient({ + link: new HttpLink({ + uri: getApiUrl(), + headers: { + // 'm-color': 'blue', + }, + }), + cache: new InMemoryCache({ + dataIdFromObject: (object) => { + switch (object.__typename) { + case 'TokenDayData': { + return `${object.tokenAddress}${object.datetime}` + } + case 'FactoryDayData': { + return `${object.id}${object.dayId}` + } + case 'Token': { + return `${object.tokenAddress}${object.name}` + } + case 'Pool': { + return `${object.poolAddress}${object.datetime}` + } + default: { + return object.id || object._id + } + } + }, + }), + shouldBatch: true, +}) diff --git a/src/apollo/queries.js b/src/apollo/queries.js new file mode 100644 index 00000000..2f75e3bc --- /dev/null +++ b/src/apollo/queries.js @@ -0,0 +1,32 @@ +import gql from 'graphql-tag' + +const TokenFields = ` + fragment TokenFields on Token { + tokenAddress + name + symbol + derivedETH + volume + volumeUSD + untrackedVolumeUSD + totalValueLocked + totalValueLockedUSD + txCount + feesUSD + } +` + +export const TOKENS_DATA = ({ tokenIds = [] }) => { + const tokenString = `[${tokenIds.map((token) => `"${token}"`).join(',')}]` + + let queryString = ` + ${TokenFields} + query tokensData { + tokensData(first: 500, where: {tokenAddressIn: ${tokenString}, periodIn: "one_day"}) { + token{...TokenFields} + period + } + } + ` + return gql(queryString) +} diff --git a/src/components/CurrencyInputPanel/FiatValue.tsx b/src/components/CurrencyInputPanel/FiatValue.tsx index 7121a048..2e9ae6ca 100644 --- a/src/components/CurrencyInputPanel/FiatValue.tsx +++ b/src/components/CurrencyInputPanel/FiatValue.tsx @@ -16,49 +16,19 @@ const FiatLoadingBubble = styled(LoadingBubble)` height: 1rem; ` -export function FiatValue({ - fiatValue, - priceImpact, -}: { - fiatValue: { data?: number; isLoading: boolean } - priceImpact?: Percent -}) { - const { formatNumber, formatPercent } = useFormatter() - - const priceImpactColor = useMemo(() => { - if (!priceImpact) { - return undefined - } - if (priceImpact.lessThan('0')) { - return 'success' - } - const severity = warningSeverity(priceImpact) - if (severity < 1) { - return 'neutral3' - } - if (severity < 3) { - return 'deprecated_yellow1' - } - return 'critical' - }, [priceImpact]) - - if (fiatValue.isLoading) { - return - } +export function FiatValue({ fiatValue, priceImpact }: { fiatValue: number; priceImpact?: Percent }) { + const { formatNumber } = useFormatter() return ( - {fiatValue.data ? ( - formatNumber({ - input: fiatValue.data, - type: NumberType.FiatTokenPrice, - }) + {fiatValue ? ( + formatNumber({ input: fiatValue, type: NumberType.FiatTokenPrice }) ) : ( Not enough liquidity to show accurate USD value.}>- )} - {priceImpact && ( + {/* {priceImpact && ( The estimated difference between the USD values of input and output amounts.} @@ -66,7 +36,7 @@ export function FiatValue({ ({formatPercent(priceImpact.multiply(-1))}) - )} + )} */} ) } diff --git a/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx b/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx index 64fdb172..0688206e 100644 --- a/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx +++ b/src/components/CurrencyInputPanel/SwapCurrencyInputPanel.tsx @@ -222,7 +222,7 @@ interface SwapCurrencyInputPanelProps { pair?: Pair | null hideInput?: boolean otherCurrency?: Currency | null - fiatValue?: { data?: number; isLoading: boolean } + fiatValue?: number priceImpact?: Percent id: string showCommonBases?: boolean @@ -398,7 +398,7 @@ const SwapCurrencyInputPanel = forwardRef )} - {fiatValue && } + {fiatValue === 0 ? 'N/A' : fiatValue && } diff --git a/src/components/CurrencyInputPanel/index.tsx b/src/components/CurrencyInputPanel/index.tsx index bd80552b..50e3b59a 100644 --- a/src/components/CurrencyInputPanel/index.tsx +++ b/src/components/CurrencyInputPanel/index.tsx @@ -179,7 +179,7 @@ interface CurrencyInputPanelProps { pair?: Pair | null hideInput?: boolean otherCurrency?: Currency | null - fiatValue?: { data?: number; isLoading: boolean } + fiatValue?: number id: string showCommonBases?: boolean showCurrencyAmount?: boolean @@ -310,9 +310,9 @@ export default function CurrencyInputPanel({ )} - {/* - {fiatValue && } - */} + + {fiatValue === 0 ? 'N/A' : fiatValue && } + )} diff --git a/src/connectors/index.ts b/src/connectors/index.ts index cea8e517..303659c9 100644 --- a/src/connectors/index.ts +++ b/src/connectors/index.ts @@ -3,6 +3,17 @@ import { InjectedConnector } from '@starknet-react/core' export const NETWORK_CHAIN_ID: number = parseInt(process.env.REACT_APP_CHAIN_ID ?? '5') +export const isProductionEnvironment = () => { + if (!window.location) { + return false + } + if (String(window.location) === '//') { + return false + } + const host = new URL(String(window.location))?.host || '' + return host === 'app.jediswap.xyz' +} + export const isTestnetEnvironment = () => { if (!location) { return false diff --git a/src/constants/tokens.ts b/src/constants/tokens.ts index 775f6ebd..a51328eb 100644 --- a/src/constants/tokens.ts +++ b/src/constants/tokens.ts @@ -3,6 +3,7 @@ import { ChainId, Currency, NativeCurrency, Percent, Token } from '@vnaysn/jedis // import { fortmatic, injected, portis, walletconnect, walletlink, argentX } from '../connectors' import JSBI from 'jsbi' +import { isProductionEnvironment } from 'connectors' export const DEFAULT_CHAIN_ID = ChainId.MAINNET export const NONFUNGIBLE_POSITION_MANAGER_ADDRESSES = '0xC36442b4a4522E871399CD717aBDD847Ab11FE88' @@ -17,6 +18,13 @@ export const MAX_UINT128 = BigInt(2) ** BigInt(128) - BigInt(1) export const NATIVE_CHAIN_ID = 'NATIVE' export const ZERO_ADDRESS_STARKNET = '0x0000000000000000000000000000000000000000000000000000000000000000' +export const getApiUrl = () => { + if (isProductionEnvironment()) { + return 'https://api.v2.goerli.jediswap.xyz/graphql' + } + return 'https://api.v2.jediswap.xyz/graphql' +} + const cachedNativeCurrency: { [chainId: string]: NativeCurrency | Token } = {} export function nativeOnChain(chainId: ChainId): NativeCurrency | Token { if (cachedNativeCurrency[chainId]) return cachedNativeCurrency[chainId] diff --git a/src/index.tsx b/src/index.tsx index a92456b7..92f0064e 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -32,6 +32,7 @@ import RadialGradientByChainUpdater from './theme/components/RadialGradientByCha import { goerli, mainnet, sepolia } from '@starknet-react/chains' import { StarknetConfig, publicProvider, argent, braavos } from '@starknet-react/core' import { StarknetProvider } from 'context/StarknetProvider' +import { jediSwapClient } from 'apollo/client' function Updaters() { const location = useLocation() @@ -66,7 +67,7 @@ createRoot(container).render( {/* */} - + diff --git a/src/pages/AddLiquidity/index.tsx b/src/pages/AddLiquidity/index.tsx index 6eb28578..d4db2b3b 100644 --- a/src/pages/AddLiquidity/index.tsx +++ b/src/pages/AddLiquidity/index.tsx @@ -71,6 +71,10 @@ import { BigNumberish, cairo, Call, CallData, hash, num } from 'starknet' import JSBI from 'jsbi' import { toI32 } from 'utils/toI32' import { useApprovalCall } from 'hooks/useApproveCall' +import { useQuery } from 'react-query' +import { jediSwapClient } from 'apollo/client' +import { TOKENS_DATA } from 'apollo/queries' +import { isAddressValidForStarknet } from 'utils/addresses' const DEFAULT_ADD_IN_RANGE_SLIPPAGE_TOLERANCE = new Percent(50, 10_000) @@ -210,6 +214,61 @@ function AddLiquidity() { outOfRange ? ZERO_PERCENT : DEFAULT_ADD_IN_RANGE_SLIPPAGE_TOLERANCE ) + const separatedFiatValueofLiquidity = useQuery({ + queryKey: ['fiat_value', position?.amount0, position?.amount1], + queryFn: async () => { + const ids = [] + if (!position?.amount0 && !position?.amount1) return + if (position?.amount0) ids.push(position?.amount0.currency.address) + if (position?.amount1) ids.push(position?.amount1.currency.address) + let result = await jediSwapClient.query({ + query: TOKENS_DATA({ tokenIds: ids }), + // fetchPolicy: 'cache-first', + }) + + try { + if (result.data) { + const tokensData = result.data.tokensData + if (tokensData) { + const [price0, price1] = [tokensData[0], tokensData[1]] + const isToken0InputAmount = + isAddressValidForStarknet(position?.amount0.currency.address) === + isAddressValidForStarknet(price0.token.tokenAddress) + const price0_one_day = price0?.period?.one_day?.close + const price1_one_day = price1?.period?.one_day?.close + return { + token0usdPrice: isToken0InputAmount ? price0_one_day : price1_one_day, + token1usdPrice: isToken0InputAmount ? price1_one_day : price0_one_day, + } + } + } + + return { token0usdPrice: undefined, token1usdPrice: undefined } + } catch (e) { + console.log(e) + return { token0usdPrice: null, token1usdPrice: null } + } + }, + }) + + const { token0usdPrice, token1usdPrice } = useMemo(() => { + if (!separatedFiatValueofLiquidity.data) return { token0usdPrice: undefined, token1usdPrice: undefined } + + const token0usdPrice = separatedFiatValueofLiquidity.data.token0usdPrice + ? Number(separatedFiatValueofLiquidity.data.token0usdPrice) * Number(position?.amount0.toSignificant()) + : undefined + const token1usdPrice = separatedFiatValueofLiquidity.data.token1usdPrice + ? Number(separatedFiatValueofLiquidity.data.token1usdPrice) * Number(position?.amount1.toSignificant()) + : undefined + + const isLiquidityToken0PositionToken0 = + position?.amount0.currency.address === (parsedAmounts.CURRENCY_A?.currency as any).address + return { + token0usdPrice: isLiquidityToken0PositionToken0 ? token0usdPrice : token1usdPrice, + token1usdPrice: isLiquidityToken0PositionToken0 ? token1usdPrice : token0usdPrice, + } + }, [separatedFiatValueofLiquidity]) + useEffect(() => { if (txData) console.log(txData, 'txData') }, [txData]) @@ -512,23 +571,6 @@ function AddLiquidity() { ) - const usdcValueCurrencyA = usdcValues[Field.CURRENCY_A] - const usdcValueCurrencyB = usdcValues[Field.CURRENCY_B] - const currencyAFiat = useMemo( - () => ({ - data: usdcValueCurrencyA ? parseFloat(usdcValueCurrencyA.toSignificant()) : undefined, - isLoading: false, - }), - [usdcValueCurrencyA] - ) - const currencyBFiat = useMemo( - () => ({ - data: usdcValueCurrencyB ? parseFloat(usdcValueCurrencyB.toSignificant()) : undefined, - isLoading: false, - }), - [usdcValueCurrencyB] - ) - // const owner = useSingleCallResult(tokenId ? positionManager : null, 'ownerOf', [tokenId]).result?.[0] // const ownsNFT = // addressesAreEquivalent(owner, account) || addressesAreEquivalent(existingPositionDetails?.operator, account) @@ -832,7 +874,7 @@ function AddLiquidity() { showMaxButton={!atMaxAmounts[Field.CURRENCY_A]} currency={currencies[Field.CURRENCY_A] ?? null} id="add-liquidity-input-tokena" - fiatValue={currencyAFiat} + fiatValue={token0usdPrice} showCommonBases locked={depositADisabled} /> @@ -844,7 +886,7 @@ function AddLiquidity() { onFieldBInput(maxAmounts[Field.CURRENCY_B]?.toExact() ?? '') }} showMaxButton={!atMaxAmounts[Field.CURRENCY_B]} - fiatValue={currencyBFiat} + fiatValue={token1usdPrice} currency={currencies[Field.CURRENCY_B] ?? null} id="add-liquidity-input-tokenb" showCommonBases diff --git a/src/pages/Pool/PositionPage.tsx b/src/pages/Pool/PositionPage.tsx index 9cf44cc2..6d652fb5 100644 --- a/src/pages/Pool/PositionPage.tsx +++ b/src/pages/Pool/PositionPage.tsx @@ -51,6 +51,7 @@ import { LoadingRows } from './styled' import { useContractWrite } from '@starknet-react/core' import { cairo, Call, CallData, validateAndParseAddress } from 'starknet' import { DEFAULT_CHAIN_ID, MAX_UINT128, NONFUNGIBLE_POOL_MANAGER_ADDRESS } from 'constants/tokens' +import TokensList from 'data/tokens-list.json' const PositionPageButtonPrimary = styled(ButtonPrimary)` width: 228px; @@ -168,6 +169,10 @@ const NFTImage = styled.img` z-index: 1; ` +import { useQuery } from 'react-query' +import { jediSwapClient } from 'apollo/client' +import { TOKENS_DATA } from 'apollo/queries' + function CurrentPriceCard({ inverted, pool, @@ -667,14 +672,49 @@ function PositionPageContent() { return amount0.add(amount1) }, [price0, price1, feeValue0, feeValue1]) - const fiatValueOfLiquidity: CurrencyAmount | null = useMemo(() => { - if (!price0 || !price1 || !position) { - return null + const separatedFiatValueofLiquidity = useQuery({ + queryKey: [`fiat_value_0/${position?.amount0.toSignificant()}/${position?.amount0.currency.symbol}`], + queryFn: async () => { + const ids = [] + if (!position?.amount0 && !position?.amount1) return + if (position?.amount0) ids.push(position?.amount0.currency.address) + if (position?.amount1) ids.push(position?.amount1.currency.address) + let result = await jediSwapClient.query({ + query: TOKENS_DATA({ tokenIds: ids }), + fetchPolicy: 'cache-first', + }) + + try { + if (result.data) { + const tokensData = result.data.tokensData + if (tokensData) { + const [price0, price1] = [tokensData[0], tokensData[1]] + return { token0usdPrice: price1?.period?.one_day?.close, token1usdPrice: price0?.period?.one_day?.close } + } + } + } catch (e) { + console.log(e) + return { token0usdPrice: null, token1usdPrice: null } + } + }, + }) + + const { token0usdPrice, token1usdPrice } = useMemo(() => { + if (!separatedFiatValueofLiquidity.data) return { token0usdPrice: undefined, token1usdPrice: undefined } + return { + token0usdPrice: separatedFiatValueofLiquidity.data.token0usdPrice + ? separatedFiatValueofLiquidity.data.token0usdPrice * position?.amount0.toSignificant() + : undefined, + token1usdPrice: separatedFiatValueofLiquidity.data.token1usdPrice + ? separatedFiatValueofLiquidity.data.token1usdPrice * position?.amount1.toSignificant() + : undefined, } - const amount0 = price0.quote(position.amount0) - const amount1 = price1.quote(position.amount1) - return amount0.add(amount1) - }, [price0, price1, position]) + }, [separatedFiatValueofLiquidity]) + + const fiatValueofLiquidity = useMemo(() => { + if (token0usdPrice && token1usdPrice) (Number(token0usdPrice) + Number(token1usdPrice)).toFixed(4) + return undefined + }, [token0usdPrice, token1usdPrice]) useEffect(() => { if (callData) { @@ -873,9 +913,9 @@ function PositionPageContent() { - {fiatValueOfLiquidity?.greaterThan(new Fraction(1, 100)) ? ( + {fiatValueofLiquidity ? ( - ${fiatValueOfLiquidity.toFixed(2, { groupSeparator: ',' })} + ${fiatValueofLiquidity} ) : ( diff --git a/src/pages/Swap/index.tsx b/src/pages/Swap/index.tsx index cfb0aba4..8d9e521e 100644 --- a/src/pages/Swap/index.tsx +++ b/src/pages/Swap/index.tsx @@ -72,6 +72,9 @@ import useTransactionDeadline from 'hooks/useTransactionDeadline' import { useApprovalCall } from 'hooks/useApproveCall' import { Pool, TradeType, toHex } from '@vnaysn/jediswap-sdk-v3' import fetchAllPairs from 'api/fetchAllPairs' +import { useQuery } from 'react-query' +import { jediSwapClient } from 'apollo/client' +import { TOKENS_DATA } from 'apollo/queries' export const ArrowContainer = styled.div` display: inline-flex; @@ -373,8 +376,7 @@ export function Swap({ }, [independentField, parsedAmount, showWrap, trade] ) - const showFiatValueInput = Boolean(parsedAmounts[Field.INPUT]) - const showFiatValueOutput = Boolean(parsedAmounts[Field.OUTPUT]) + const getSingleUnitAmount = (currency?: Currency) => { if (!currency) { return @@ -382,15 +384,6 @@ export function Swap({ return CurrencyAmount.fromRawAmount(currency, JSBI.BigInt(10 ** currency.decimals)) } - const fiatValueInput = useUSDPrice( - parsedAmounts[Field.INPUT] ?? getSingleUnitAmount(currencies[Field.INPUT]), - currencies[Field.INPUT] - ) - const fiatValueOutput = useUSDPrice( - parsedAmounts[Field.OUTPUT] ?? getSingleUnitAmount(currencies[Field.OUTPUT]), - currencies[Field.OUTPUT] - ) - const [routeNotFound, routeIsLoading, routeIsSyncing] = useMemo( () => [ tradeState === TradeState.NO_ROUTE_FOUND, @@ -544,6 +537,55 @@ export function Swap({ } }, [swapCallData]) + const separatedFiatValueofLiquidity = useQuery({ + queryKey: ['fiat_value', trade?.inputAmount, trade?.outputAmount], + queryFn: async () => { + const ids = [] + if (!trade?.inputAmount && !trade?.outputAmount) return + if (trade?.inputAmount) ids.push((trade?.inputAmount.currency as any).address) + if (trade?.outputAmount) ids.push((trade?.outputAmount.currency as any).address) + let result = await jediSwapClient.query({ + query: TOKENS_DATA({ tokenIds: ids }), + // fetchPolicy: 'cache-first', + }) + + try { + if (result.data) { + const tokensData = result.data.tokensData + if (tokensData) { + const [price0, price1] = [tokensData[0], tokensData[1]] + const isToken0InputAmount = + validateAndParseAddress((trade?.inputAmount.currency as any).address) === + validateAndParseAddress(price0.token.tokenAddress) + const price0_one_day = price0?.period?.one_day?.close + const price1_one_day = price1?.period?.one_day?.close + return { + token0usdPrice: isToken0InputAmount ? price0_one_day : price1_one_day, + token1usdPrice: isToken0InputAmount ? price1_one_day : price0_one_day, + } + } + } + + return { token0usdPrice: undefined, token1usdPrice: undefined } + } catch (e) { + console.log(e) + return { token0usdPrice: null, token1usdPrice: null } + } + }, + }) + + const { token0usdPrice, token1usdPrice } = useMemo(() => { + if (!separatedFiatValueofLiquidity.data || !trade) return { token0usdPrice: undefined, token1usdPrice: undefined } + return { + token0usdPrice: separatedFiatValueofLiquidity.data.token0usdPrice + ? Number(separatedFiatValueofLiquidity.data.token0usdPrice) * Number(trade.inputAmount.toSignificant()) + : undefined, + token1usdPrice: separatedFiatValueofLiquidity.data.token1usdPrice + ? Number(separatedFiatValueofLiquidity.data.token1usdPrice) * Number(trade?.outputAmount.toSignificant()) + : undefined, + } + }, [separatedFiatValueofLiquidity]) + const amountToApprove = useMemo( () => (trade ? trade.maximumAmountIn(allowedSlippage) : undefined), [trade, allowedSlippage] @@ -867,7 +909,7 @@ export function Swap({ currency={currencies[Field.INPUT] ?? null} onUserInput={handleTypeInput} onMax={handleMaxInput} - fiatValue={showFiatValueInput ? fiatValueInput : undefined} + fiatValue={token0usdPrice} onCurrencySelect={handleInputSelect} otherCurrency={currencies[Field.OUTPUT]} showCommonBases @@ -901,7 +943,7 @@ export function Swap({ label={To} showMaxButton={false} hideBalance={false} - fiatValue={showFiatValueOutput ? fiatValueOutput : undefined} + fiatValue={token1usdPrice} priceImpact={stablecoinPriceImpact} currency={currencies[Field.OUTPUT] ?? null} onCurrencySelect={handleOutputSelect} diff --git a/yarn.lock b/yarn.lock index ee02d4a9..aa851620 100644 --- a/yarn.lock +++ b/yarn.lock @@ -134,6 +134,55 @@ tslib "^2.3.0" zen-observable-ts "^1.2.5" +"@apollo/react-common@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@apollo/react-common/-/react-common-3.1.4.tgz#ec13c985be23ea8e799c9ea18e696eccc97be345" + integrity sha512-X5Kyro73bthWSCBJUC5XYQqMnG0dLWuDZmVkzog9dynovhfiVCV4kPSdgSIkqnb++cwCzOVuQ4rDKVwo2XRzQA== + dependencies: + ts-invariant "^0.4.4" + tslib "^1.10.0" + +"@apollo/react-components@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-components/-/react-components-3.1.5.tgz#040d2f35ce4947747efe16f76d59dcbd797ffdaf" + integrity sha512-c82VyUuE9VBnJB7bnX+3dmwpIPMhyjMwyoSLyQWPHxz8jK4ak30XszJtqFf4eC4hwvvLYa+Ou6X73Q8V8e2/jg== + dependencies: + "@apollo/react-common" "^3.1.4" + "@apollo/react-hooks" "^3.1.5" + prop-types "^15.7.2" + ts-invariant "^0.4.4" + tslib "^1.10.0" + +"@apollo/react-hoc@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-hoc/-/react-hoc-3.1.5.tgz#6552d2fb4aafc59fdc8f4e353358b98b89cfab6f" + integrity sha512-jlZ2pvEnRevLa54H563BU0/xrYSgWQ72GksarxUzCHQW85nmn9wQln0kLBX7Ua7SBt9WgiuYQXQVechaaCulfQ== + dependencies: + "@apollo/react-common" "^3.1.4" + "@apollo/react-components" "^3.1.5" + hoist-non-react-statics "^3.3.0" + ts-invariant "^0.4.4" + tslib "^1.10.0" + +"@apollo/react-hooks@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-hooks/-/react-hooks-3.1.5.tgz#7e710be52461255ae7fc0b3b9c2ece64299c10e6" + integrity sha512-y0CJ393DLxIIkksRup4nt+vSjxalbZBXnnXxYbviq/woj+zKa431zy0yT4LqyRKpFy9ahMIwxBnBwfwIoupqLQ== + dependencies: + "@apollo/react-common" "^3.1.4" + "@wry/equality" "^0.1.9" + ts-invariant "^0.4.4" + tslib "^1.10.0" + +"@apollo/react-ssr@^3.1.5": + version "3.1.5" + resolved "https://registry.yarnpkg.com/@apollo/react-ssr/-/react-ssr-3.1.5.tgz#53703cd493afcde567acc6d5512cab03dafce6de" + integrity sha512-wuLPkKlctNn3u8EU8rlECyktpOUCeekFfb0KhIKknpGY6Lza2Qu0bThx7D9MIbVEzhKadNNrzLcpk0Y8/5UuWg== + dependencies: + "@apollo/react-common" "^3.1.4" + "@apollo/react-hooks" "^3.1.5" + tslib "^1.10.0" + "@ardatan/relay-compiler@12.0.0": version "12.0.0" resolved "https://registry.yarnpkg.com/@ardatan/relay-compiler/-/relay-compiler-12.0.0.tgz#2e4cca43088e807adc63450e8cab037020e91106" @@ -5949,6 +5998,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.13.tgz#392ba5c51b1550ee3c38082cf1e59b3144f06871" integrity sha512-OqG3iSnFg3cnJLsSRyhriILdDfBOwGty0fmnalbsPdYKbDgK6TI9On/36lzO/1bcaeEkg9OGD2wYLjx8t5MZNQ== +"@types/node@>=6": + version "20.11.19" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.19.tgz#b466de054e9cb5b3831bee38938de64ac7f81195" + integrity sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ== + dependencies: + undici-types "~5.26.4" + "@types/node@^10.12.18": version "10.17.60" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" @@ -7692,6 +7748,14 @@ fast-url-parser "^1.1.3" tslib "^2.3.1" +"@wry/context@^0.4.0": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" + integrity sha512-LrKVLove/zw6h2Md/KZyWxIkFM6AoyKp71OqpH9Hiip1csjPVoD3tPxlbQUNxEnHENks3UGgNpSBCAfq9KWuag== + dependencies: + "@types/node" ">=6" + tslib "^1.9.3" + "@wry/context@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.7.0.tgz#be88e22c0ddf62aeb0ae9f95c3d90932c619a5c8" @@ -7699,6 +7763,13 @@ dependencies: tslib "^2.3.0" +"@wry/equality@^0.1.2", "@wry/equality@^0.1.9": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + "@wry/equality@^0.5.0": version "0.5.3" resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.5.3.tgz#fafebc69561aa2d40340da89fa7dc4b1f6fb7831" @@ -8024,6 +8095,63 @@ anymatch@^3.0.3, anymatch@^3.1.3, anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +apollo-cache-inmemory@^1.6.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/apollo-cache-inmemory/-/apollo-cache-inmemory-1.6.6.tgz#56d1f2a463a6b9db32e9fa990af16d2a008206fd" + integrity sha512-L8pToTW/+Xru2FFAhkZ1OA9q4V4nuvfoPecBM34DecAugUZEBhI2Hmpgnzq2hTKZ60LAMrlqiASm0aqAY6F8/A== + dependencies: + apollo-cache "^1.3.5" + apollo-utilities "^1.3.4" + optimism "^0.10.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + +apollo-cache@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/apollo-cache/-/apollo-cache-1.3.5.tgz#9dbebfc8dbe8fe7f97ba568a224bca2c5d81f461" + integrity sha512-1XoDy8kJnyWY/i/+gLTEbYLnoiVtS8y7ikBr/IfmML4Qb+CM7dEEbIUOjnY716WqmZ/UpXIxTfJsY7rMcqiCXA== + dependencies: + apollo-utilities "^1.3.4" + tslib "^1.10.0" + +apollo-link-http-common@^0.2.16: + version "0.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" + integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== + dependencies: + apollo-link "^1.2.14" + ts-invariant "^0.4.0" + tslib "^1.9.3" + +apollo-link-http@^1.5.17: + version "1.5.17" + resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba" + integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg== + dependencies: + apollo-link "^1.2.14" + apollo-link-http-common "^0.2.16" + tslib "^1.9.3" + +apollo-link@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== + dependencies: + apollo-utilities "^1.3.0" + ts-invariant "^0.4.0" + tslib "^1.9.3" + zen-observable-ts "^0.8.21" + +apollo-utilities@^1.3.0, apollo-utilities@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + arch@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" @@ -16794,6 +16922,13 @@ open@^8.0.9, open@^8.4.0: resolved "https://registry.npmjs.org/openzeppelin-solidity/-/openzeppelin-solidity-2.3.0.tgz" integrity sha512-QYeiPLvB1oSbDt6lDQvvpx7k8ODczvE474hb2kLXZBPKMsxKT1WxTCHBYrCU7kS7hfAku4DcJ0jqOyL+jvjwQw== +optimism@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.3.tgz#163268fdc741dea2fb50f300bedda80356445fd7" + integrity sha512-9A5pqGoQk49H6Vhjb9kPgAeeECfUDF6aIICbMDL23kDLStBn1MWk3YvcZ4xWF9CsSf6XEgvRLkXy4xof/56vVw== + dependencies: + "@wry/context" "^0.4.0" + optimism@^0.16.1: version "0.16.2" resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.16.2.tgz#519b0c78b3b30954baed0defe5143de7776bf081" @@ -18272,6 +18407,17 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-apollo@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/react-apollo/-/react-apollo-3.1.5.tgz#36692d393c47e7ccc37f0a885c7cc5a8b4961c91" + integrity sha512-xOxMqxORps+WHrUYbjVHPliviomefOpu5Sh35oO3osuOyPTxvrljdfTLGCggMhcXBsDljtS5Oy4g+ijWg3D4JQ== + dependencies: + "@apollo/react-common" "^3.1.4" + "@apollo/react-components" "^3.1.5" + "@apollo/react-hoc" "^3.1.5" + "@apollo/react-hooks" "^3.1.5" + "@apollo/react-ssr" "^3.1.5" + react-app-polyfill@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" @@ -20763,6 +20909,13 @@ ts-invariant@^0.10.3: dependencies: tslib "^2.1.0" +ts-invariant@^0.4.0, ts-invariant@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + ts-jest@^29.1.1: version "29.1.1" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" @@ -20821,7 +20974,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.0.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: +tslib@1.14.1, tslib@^1.0.0, tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -21058,6 +21211,11 @@ uncrypto@^0.1.3: resolved "https://registry.yarnpkg.com/uncrypto/-/uncrypto-0.1.3.tgz#e1288d609226f2d02d8d69ee861fa20d8348ef2b" integrity sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.12.0, undici@^5.14.0, undici@^5.22.1: version "5.23.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" @@ -22411,6 +22569,14 @@ youch@^3.2.2: mustache "^4.2.0" stacktracey "^2.1.8" +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" + zen-observable-ts@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" @@ -22418,7 +22584,7 @@ zen-observable-ts@^1.2.5: dependencies: zen-observable "0.8.15" -zen-observable@0.8.15: +zen-observable@0.8.15, zen-observable@^0.8.0: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==