post launch fixes (#536)

This commit is contained in:
Linkie Link 2023-10-11 16:32:30 +02:00 committed by GitHub
parent 96719b7ad5
commit 5da0ab009f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 330 additions and 240 deletions

View File

@ -19,34 +19,10 @@ NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/ NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
NEXT_PUBLIC_CANDLES_ENDPOINT=https://api.thegraph.com/subgraphs/name/donovansolms/osmosis-tv-candles-test NEXT_PUBLIC_CANDLES_ENDPOINT=https://api.thegraph.com/subgraphs/name/donovansolms/osmosis-tv-candles-test
NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045 NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045
CHARTING_LIBRARY_REPOSITORY=github.com/tradingview/charting_library
CHARTING_LIBRARY_ACCESS_TOKEN=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
CHARTING_LIBRARY_USERNAME=mars-git-demo
# TESTNET # CHARTING_LIBRARY_REPOSITORY=github.com/tradingview/charting_library
# NEXT_PUBLIC_NETWORK=testnet CHARTING_LIBRARY_ACCESS_TOKEN=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
# NEXT_PUBLIC_CHAIN_ID=osmo-test-5 CHARTING_LIBRARY_USERNAME=mars-git-demo
# NEXT_PUBLIC_RPC=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-rpc-front/
# NEXT_PUBLIC_GQL=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-hive-front/graphql
# NEXT_PUBLIC_REST=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-lcd-front/
# NEXT_PUBLIC_SWAP=https://testnet.osmosis.zone
# NEXT_PUBLIC_VAULT_APR=https://testnet-api.marsprotocol.io/v1/vaults/osmosis
# NEXT_PUBLIC_ACCOUNT_NFT=osmo1hdk6nps2l2tdfgly0tegcgwl239l45etuae7nsc6s93u0yrqk4rqv489kl
# NEXT_PUBLIC_ORACLE=osmo1dxu93scjdnx42txdp9d4hm3snffvnzmkp4jpc9sml8xlu3ncgamsl2lx58
# NEXT_PUBLIC_RED_BANK=osmo1hs4sm0fah9rk4mz8e56v4n76g0q9fffdkkjm3f8tjagkdx78pqcq75pk0a
# NEXT_PUBLIC_CREDIT_MANAGER=osmo1zwugj8tz9nq63m3lxcfpunp0xr5lnlxdr0yyn4gpftx3ham09m4skn73ew
# NEXT_PUBLIC_INCENTIVES=osmo1nu0k6g294jela67vyth6nwr3l42gutq2m07pg9927f7v7tuv0d4sre9fr7
# NEXT_PUBLIC_ZAPPER=osmo1jwtmujld4ew2vt67qnmpdxr3fmmle2yg823de5ygvf47uvhpu76qlhf82q
# NEXT_PUBLIC_SWAPPER=osmo1ee9cq8dcknmw43znznx6vuupx5ku0tt505agccgaz5gn48mhe45s3kwwfm
# NEXT_PUBLIC_PARAMS=osmo1h334tvddn82m4apm08rm9k6kt32ws7vy0c4n30ngrvu6h6yxh8eq9l9jfh
# NEXT_PUBLIC_API=http://localhost:3000/api
# NEXT_PUBLIC_CANDLES_ENDPOINT="https://api.thegraph.com/subgraphs/name/{NAME}/{GRAPH_NAME}"
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
# CHARTING_LIBRARY_REPOSITORY="github.com/username/charting_library/"
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
# NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045
# MAINNET # # MAINNET #
# NEXT_PUBLIC_NETWORK=mainnet # NEXT_PUBLIC_NETWORK=mainnet
@ -64,9 +40,6 @@ CHARTING_LIBRARY_USERNAME=mars-git-demo
# NEXT_PUBLIC_ZAPPER=osmo17qwvc70pzc9mudr8t02t3pl74hhqsgwnskl734p4hug3s8mkerdqzduf7c # NEXT_PUBLIC_ZAPPER=osmo17qwvc70pzc9mudr8t02t3pl74hhqsgwnskl734p4hug3s8mkerdqzduf7c
# NEXT_PUBLIC_SWAPPER=osmo1wee0z8c7tcawyl647eapqs4a88q8jpa7ddy6nn2nrs7t47p2zhxswetwla # NEXT_PUBLIC_SWAPPER=osmo1wee0z8c7tcawyl647eapqs4a88q8jpa7ddy6nn2nrs7t47p2zhxswetwla
# NEXT_PUBLIC_API=http://localhost:3000/api # NEXT_PUBLIC_API=http://localhost:3000/api
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
# CHARTING_LIBRARY_REPOSITORY="username/charting_library"
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api # NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/ # NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
# NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045 # NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045

View File

@ -17,11 +17,11 @@
"dependencies": { "dependencies": {
"@cosmjs/cosmwasm-stargate": "^0.31.1", "@cosmjs/cosmwasm-stargate": "^0.31.1",
"@delphi-labs/shuttle-react": "^3.9.0", "@delphi-labs/shuttle-react": "^3.9.0",
"@keplr-wallet/cosmos": "^0.12.28", "@keplr-wallet/cosmos": "^0.12.32",
"@sentry/nextjs": "^7.73.0", "@sentry/nextjs": "^7.73.0",
"@splinetool/react-spline": "^2.2.6", "@splinetool/react-spline": "^2.2.6",
"@splinetool/runtime": "^0.9.473", "@splinetool/runtime": "^0.9.477",
"@tanstack/react-table": "^8.10.3", "@tanstack/react-table": "^8.10.6",
"@tippyjs/react": "^4.2.6", "@tippyjs/react": "^4.2.6",
"bignumber.js": "^9.1.2", "bignumber.js": "^9.1.2",
"classnames": "^2.3.2", "classnames": "^2.3.2",
@ -29,7 +29,7 @@
"lodash.debounce": "^4.0.8", "lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1", "lodash.throttle": "^4.1.1",
"moment": "^2.29.4", "moment": "^2.29.4",
"next": "13.5.3", "next": "^13.5.4",
"react": "^18.2.0", "react": "^18.2.0",
"react-device-detect": "^2.2.3", "react-device-detect": "^2.2.3",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
@ -43,7 +43,7 @@
"recharts": "^2.8.0", "recharts": "^2.8.0",
"swr": "^2.2.4", "swr": "^2.2.4",
"tailwind-scrollbar-hide": "^1.1.7", "tailwind-scrollbar-hide": "^1.1.7",
"zustand": "^4.4.1" "zustand": "^4.4.3"
}, },
"devDependencies": { "devDependencies": {
"@svgr/webpack": "^8.1.0", "@svgr/webpack": "^8.1.0",
@ -53,15 +53,15 @@
"@types/lodash.debounce": "^4.0.7", "@types/lodash.debounce": "^4.0.7",
"@types/lodash.throttle": "^4.1.7", "@types/lodash.throttle": "^4.1.7",
"@types/node": "^20.7.0", "@types/node": "^20.7.0",
"@types/react": "18.2.23", "@types/react": "18.2.28",
"@types/react-dom": "18.2.11", "@types/react-dom": "18.2.13",
"@types/react-helmet": "^6.1.7", "@types/react-helmet": "^6.1.7",
"autoprefixer": "^10.4.16", "autoprefixer": "^10.4.16",
"babel-jest": "^29.7.0", "babel-jest": "^29.7.0",
"dotenv": "^16.3.1", "dotenv": "^16.3.1",
"dotenv-cli": "^7.3.0", "dotenv-cli": "^7.3.0",
"eslint": "8.51.0", "eslint": "^8.51.0",
"eslint-config-next": "^13.5.3", "eslint-config-next": "^13.5.4",
"eslint-plugin-import": "^2.28.1", "eslint-plugin-import": "^2.28.1",
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"jest": "^29.7.0", "jest": "^29.7.0",

View File

@ -87,7 +87,7 @@ function AccountDetails(props: Props) {
const apr = useMemo( const apr = useMemo(
() => () =>
calculateAccountApr(updatedAccount ?? account, borrowAssetsData, lendingAssetsData, prices), calculateAccountApr(updatedAccount ?? account, borrowAssetsData, lendingAssetsData, prices),
[account, borrowAssetsData, lendingAssetsData, prices], [account, borrowAssetsData, lendingAssetsData, prices, updatedAccount],
) )
function AccountDetailsHeader() { function AccountDetailsHeader() {

View File

@ -188,14 +188,6 @@ export const VaultTable = (props: Props) => {
return <Text className='text-xs'>{formatPercent(row.original.ltv.max)}</Text> return <Text className='text-xs'>{formatPercent(row.original.ltv.max)}</Text>
}, },
}, },
{
accessorKey: 'ltv.liq',
header: 'Liq. LTV',
cell: ({ row }) => {
if (props.isLoading) return <Loading />
return <Text className='text-xs'>{formatPercent(row.original.ltv.liq)}</Text>
},
},
{ {
accessorKey: 'details', accessorKey: 'details',
enableSorting: false, enableSorting: false,

View File

@ -75,7 +75,7 @@ export default function LendingActionButtons(props: Props) {
<Tooltip <Tooltip
type='warning' type='warning'
content={ content={
<Text size='sm'>{`You dont have any ${asset.symbol}. Please first deposit ${asset.symbol} into your credit account before lending.`}</Text> <Text size='sm'>{`You dont have any ${asset.symbol}. Please first deposit ${asset.symbol} into your Credit Account before lending.`}</Text>
} }
> >
{children} {children}

View File

@ -68,7 +68,7 @@ export default function MarketDetails({ data, type }: Props) {
title: 'Oracle Price', title: 'Oracle Price',
}, },
{ {
amount: totalBorrowed.dividedBy(depositCap).multipliedBy(100).toNumber(), amount: totalBorrowed.dividedBy(marketDepositAmount).multipliedBy(100).toNumber(),
options: { minDecimals: 2, maxDecimals: 2, suffix: '%' }, options: { minDecimals: 2, maxDecimals: 2, suffix: '%' },
title: 'Utilization Rate', title: 'Utilization Rate',
}, },

View File

@ -2,6 +2,7 @@ import Spline from '@splinetool/react-spline'
import Button from 'components/Button' import Button from 'components/Button'
import Text from 'components/Text' import Text from 'components/Text'
import { DocURL } from 'types/enums/docURL'
export default function MobileNotSupported() { export default function MobileNotSupported() {
return ( return (
@ -23,7 +24,7 @@ export default function MobileNotSupported() {
text='Visit Mars v1' text='Visit Mars v1'
color='tertiary' color='tertiary'
size='lg' size='lg'
onClick={() => window.open('https://app.marsprotocol.io', '_self')} onClick={() => window.open(DocURL.V1_URL, '_self')}
/> />
</div> </div>
</div> </div>

View File

@ -85,7 +85,7 @@ function AccountDeleteModal(props: Props) {
return ( return (
<AccountDeleteAlertDialog <AccountDeleteAlertDialog
title={`Delete Credit Account ${accountId}`} title={`Delete Credit Account ${accountId}`}
description='Deleting your credit account is irreversible.' description='Deleting your Credit Account is irreversible.'
closeHandler={closeDeleteAccountModal} closeHandler={closeDeleteAccountModal}
positiveButton={{ positiveButton={{
text: 'Delete Account', text: 'Delete Account',
@ -101,7 +101,7 @@ function AccountDeleteModal(props: Props) {
description={ description={
<> <>
<Text className='mt-2 text-white/50' size='sm'> <Text className='mt-2 text-white/50' size='sm'>
The following assets within your credit account will be sent to your wallet. The following assets within your Credit Account will be sent to your wallet.
</Text> </Text>
<div className='flex flex-col w-full gap-4 py-4 overflow-y-scroll max-h-100 scrollbar-hide'> <div className='flex flex-col w-full gap-4 py-4 overflow-y-scroll max-h-100 scrollbar-hide'>
{depositsAndLends.map((position, index) => { {depositsAndLends.map((position, index) => {

View File

@ -118,7 +118,7 @@ export default function WithdrawFromAccount(props: Props) {
<div className='flex flex-wrap flex-1'> <div className='flex flex-wrap flex-1'>
<Text className='w-full mb-1'>Withdraw with borrowing</Text> <Text className='w-full mb-1'>Withdraw with borrowing</Text>
<Text size='xs' className='text-white/50'> <Text size='xs' className='text-white/50'>
Borrow assets from your credit account to withdraw to your wallet Borrow assets from your Credit Account to withdraw to your wallet
</Text> </Text>
</div> </div>
<div className='flex flex-wrap items-center justify-end'> <div className='flex flex-wrap items-center justify-end'>

View File

@ -231,8 +231,8 @@ export default function SettingsModal() {
onChange={handleLendAssets} onChange={handleLendAssets}
name='lendAssets' name='lendAssets'
value={lendAssets} value={lendAssets}
label='Lend assets in credit accounts' label='Lend assets in Credit Accounts'
description='By turning this on you will automatically lend out all the assets you deposit into your credit accounts to earn yield.' description='By turning this on you will automatically lend out all the assets you deposit into your Credit Accounts to earn yield.'
withStatus withStatus
/> />
<SettingsSwitch <SettingsSwitch

View File

@ -1,4 +1,4 @@
import React, { Suspense, useMemo } from 'react' import { Suspense, useMemo } from 'react'
import DisplayCurrency from 'components/DisplayCurrency' import DisplayCurrency from 'components/DisplayCurrency'
import { FormattedNumber } from 'components/FormattedNumber' import { FormattedNumber } from 'components/FormattedNumber'
@ -73,12 +73,12 @@ function Content(props: Props) {
] ]
}, [account, borrowAssets, lendingAssets, prices]) }, [account, borrowAssets, lendingAssets, prices])
return <Skeleton stats={stats} health={health} title={`Credit account ${props.accountId}`} /> return <Skeleton stats={stats} health={health} title={`Credit Account ${props.accountId}`} />
} }
export default function Summary(props: Props) { export default function Summary(props: Props) {
return ( return (
<Suspense fallback={<Skeleton health={0} title={`Credit account ${props.accountId}`} />}> <Suspense fallback={<Skeleton health={0} title={`Credit Account ${props.accountId}`} />}>
<Content {...props} /> <Content {...props} />
</Suspense> </Suspense>
) )

View File

@ -17,7 +17,7 @@ export default function Skeleton(props: Props) {
return ( return (
<Card className='p-4 bg-white/5'> <Card className='p-4 bg-white/5'>
<div className='flex items-center justify-between'> <div className='flex items-center justify-between'>
<Text>Credit account {props.accountId}</Text> <Text>Credit Account {props.accountId}</Text>
<Text size='xs' className='text-white/60'> <Text size='xs' className='text-white/60'>
{props.isCurrent && '(current)'} {props.isCurrent && '(current)'}
</Text> </Text>

View File

@ -1,5 +1,5 @@
import classNames from 'classnames' import classNames from 'classnames'
import React, { useCallback } from 'react' import { useCallback } from 'react'
import { useParams } from 'react-router-dom' import { useParams } from 'react-router-dom'
import AccountCreateFirst from 'components/Account/AccountCreateFirst' import AccountCreateFirst from 'components/Account/AccountCreateFirst'

View File

@ -90,7 +90,7 @@ export default function TokenInput(props: Props) {
{props.warning && ( {props.warning && (
<div className='grid items-center px-2'> <div className='grid items-center px-2'>
<Tooltip <Tooltip
content={`You don't have any ${props.asset.symbol}. Please first deposit ${props.asset.symbol} into your credit account before.`} content={`You don't have any ${props.asset.symbol}. Please first deposit ${props.asset.symbol} into your Credit Account before.`}
type='info' type='info'
interactive interactive
> >

View File

@ -34,16 +34,25 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
baseDenom: string = 'uosmo' baseDenom: string = 'uosmo'
batchSize = 1000 batchSize = 1000
enabledMarketAssetDenoms: string[] = [] enabledMarketAssetDenoms: string[] = []
pairs: string[] = [] pairs: { baseAsset: string; quoteAsset: string }[] = []
pairsWithData: string[] = [] pairsWithData: string[] = []
intervals: { [key: string]: string } = { intervals: { [key: string]: string } = {
'15': '15m', '15': '15m',
'30': '30m', '30': '30m',
'60': '1h', '60': '1h',
'240': '4h',
'1D': '1d',
}
minutesPerInterval: { [key: string]: number } = {
'15': 15,
'30': 30,
'60': 60,
'240': 60 * 4,
'1D': 60 * 24,
} }
supportedPools: string[] = [] supportedPools: string[] = []
supportedResolutions = ['15', '30', '60'] as ResolutionString[] supportedResolutions = ['15', '30', '60', '4h', 'D'] as ResolutionString[]
constructor(debug = false, baseDecimals: number, baseDenom: string) { constructor(debug = false, baseDecimals: number, baseDenom: string) {
if (debug) console.log('Start TheGraph charting library datafeed') if (debug) console.log('Start TheGraph charting library datafeed')
@ -55,19 +64,6 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
this.supportedPools = enabledMarketAssets this.supportedPools = enabledMarketAssets
.map((asset) => asset.poolId?.toString()) .map((asset) => asset.poolId?.toString())
.filter((poolId) => typeof poolId === 'string') as string[] .filter((poolId) => typeof poolId === 'string') as string[]
this.getAllPairs()
}
getAllPairs() {
const assets = getEnabledMarketAssets()
const pairs: Set<string> = new Set()
assets.forEach((asset1) => {
assets.forEach((asset2) => {
if (asset1.symbol === asset2.symbol) return
pairs.add(`${asset1.denom}${PAIR_SEPARATOR}${asset2.denom}`)
})
})
this.pairs = Array.from(pairs)
} }
getDescription(pairName: string) { getDescription(pairName: string) {
@ -102,6 +98,7 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
}) })
.then((res) => res.json()) .then((res) => res.json())
.then((json) => { .then((json) => {
this.pairs = json.data.pairs
this.pairsWithData = json.data.pairs.map( this.pairsWithData = json.data.pairs.map(
(pair: { baseAsset: string; quoteAsset: string }) => { (pair: { baseAsset: string; quoteAsset: string }) => {
return `${pair.baseAsset}${PAIR_SEPARATOR}${pair.quoteAsset}` return `${pair.baseAsset}${PAIR_SEPARATOR}${pair.quoteAsset}`
@ -125,19 +122,22 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
}) })
} }
async resolveSymbol(pairName: string, onResolve: ResolveCallback, onError: ErrorCallback) { resolveSymbol(pairName: string, onResolve: ResolveCallback, onError: ErrorCallback) {
setTimeout(() => pairName = this.getPairName(pairName)
onResolve({ setTimeout(() => {
const info: LibrarySymbolInfo = {
...defaultSymbolInfo, ...defaultSymbolInfo,
name: this.getDescription(pairName), name: this.getDescription(pairName),
full_name: pairName, full_name: this.getDescription(pairName),
description: this.getDescription(pairName), description: this.getDescription(pairName),
ticker: this.getDescription(pairName), ticker: this.getDescription(pairName),
exchange: this.exchangeName, exchange: this.exchangeName,
listed_exchange: this.exchangeName, listed_exchange: this.exchangeName,
supported_resolutions: this.supportedResolutions, supported_resolutions: this.supportedResolutions,
}), base_name: [this.getDescription(pairName)],
) } as LibrarySymbolInfo
onResolve(info)
})
} }
async getBars( async getBars(
@ -148,16 +148,37 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
): Promise<void> { ): Promise<void> {
const interval = this.intervals[resolution] const interval = this.intervals[resolution]
let pair1 = symbolInfo.full_name let pair1 = this.getPairName(symbolInfo.full_name)
let pair2: string = '' let pair2: string = ''
let pair3: string = ''
if (!this.pairsWithData.includes(pair1)) { if (!this.pairsWithData.includes(pair1)) {
if (this.debug) console.log('Pair does not have data, need to combine with 2nd pair') if (this.debug) console.log('Pair does not have data, need to combine with other pairs')
const [buyAssetDenom, sellAssetDenom] = pair1.split(PAIR_SEPARATOR) const [buyAssetDenom, sellAssetDenom] = pair1.split(PAIR_SEPARATOR)
pair1 = `${buyAssetDenom}${PAIR_SEPARATOR}${this.baseDenom}` const pair1Pools = this.pairs.filter((pair) => pair.baseAsset === buyAssetDenom)
pair2 = `${this.baseDenom}${PAIR_SEPARATOR}${sellAssetDenom}` const pair2Pools = this.pairs.filter((pair) => pair.quoteAsset === sellAssetDenom)
const matchedPools = pair1Pools.filter((pool) => {
const asset = pool.quoteAsset
return !!pair2Pools.find((pool) => pool.baseAsset === asset)
})
if (matchedPools.length) {
pair1 = `${buyAssetDenom}${PAIR_SEPARATOR}${matchedPools[0].quoteAsset}`
pair2 = `${matchedPools[0].quoteAsset}${PAIR_SEPARATOR}${sellAssetDenom}`
} else {
const middlePair = this.pairs.filter(
(pair) =>
pair1Pools.map((pairs) => pairs.quoteAsset).includes(pair.baseAsset) &&
pair2Pools.map((pairs) => pairs.baseAsset).includes(pair.quoteAsset),
)
pair1 = `${buyAssetDenom}${PAIR_SEPARATOR}${middlePair[0].baseAsset}`
pair2 = `${middlePair[0].baseAsset}${PAIR_SEPARATOR}${middlePair[0].quoteAsset}`
pair3 = `${middlePair[0].quoteAsset}${PAIR_SEPARATOR}${sellAssetDenom}`
}
} }
const pair1Bars = this.queryBarData( const pair1Bars = this.queryBarData(
@ -176,13 +197,44 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
) )
} }
await Promise.all([pair1Bars, pair2Bars]).then(([pair1Bars, pair2Bars]) => { let pair3Bars: Promise<Bar[]> | null = null
if (pair3) {
pair3Bars = this.queryBarData(
pair3.split(PAIR_SEPARATOR)[0],
pair3.split(PAIR_SEPARATOR)[1],
interval,
)
}
await Promise.all([pair1Bars, pair2Bars, pair3Bars]).then(
([pair1Bars, pair2Bars, pair3Bars]) => {
let bars = pair1Bars let bars = pair1Bars
if (!bars.length) {
onResult([], { noData: true })
return
}
if (pair2Bars) { if (pair2Bars) {
bars = this.combineBars(pair1Bars, pair2Bars) bars = this.combineBars(pair1Bars, pair2Bars)
} }
onResult(bars) if (pair3Bars) {
}) bars = this.combineBars(bars, pair3Bars)
}
const filler = Array.from({ length: this.batchSize - bars.length }).map((_, index) => ({
time: (bars[0]?.time || new Date().getTime()) - index * this.minutesPerInterval[resolution],
close: 0,
open: 0,
high: 0,
low: 0,
volume: 0,
}))
onResult([...filler, ...bars])
},
)
} }
async queryBarData(quote: string, base: string, interval: string): Promise<Bar[]> { async queryBarData(quote: string, base: string, interval: string): Promise<Bar[]> {
@ -258,6 +310,16 @@ export class OsmosisTheGraphDataFeed implements IDatafeedChartApi {
return bars return bars
} }
getPairName(name: string) {
if (name.includes(PAIR_SEPARATOR)) return name
const [symbol1, symbol2] = name.split('/')
const asset1 = ASSETS.find((asset) => asset.symbol === symbol1)
const asset2 = ASSETS.find((asset) => asset.symbol === symbol2)
return `${asset1?.denom}${PAIR_SEPARATOR}${asset2?.denom}`
}
searchSymbols(): void { searchSymbols(): void {
// Don't allow to search for symbols // Don't allow to search for symbols
} }

View File

@ -1,5 +1,6 @@
import { import {
ChartingLibraryFeatureset, ChartingLibraryFeatureset,
LibrarySymbolInfo,
ResolutionString, ResolutionString,
SeriesFormat, SeriesFormat,
Timezone, Timezone,
@ -26,7 +27,7 @@ export const overrides = {
'linetooltrendline.linewidth': 2, 'linetooltrendline.linewidth': 2,
} }
export const defaultSymbolInfo = { export const defaultSymbolInfo: Partial<LibrarySymbolInfo> = {
listed_exchange: 'Osmosis', listed_exchange: 'Osmosis',
type: 'AMM', type: 'AMM',
session: '24x7', session: '24x7',
@ -35,7 +36,7 @@ export const defaultSymbolInfo = {
timezone: 'Etc/UTC' as Timezone, timezone: 'Etc/UTC' as Timezone,
has_intraday: true, has_intraday: true,
has_daily: true, has_daily: true,
has_weekly_and_monthly: true, has_weekly_and_monthly: false,
format: 'price' as SeriesFormat, format: 'price' as SeriesFormat,
supported_resolutions: ['15'] as ResolutionString[], supported_resolutions: ['15'] as ResolutionString[],
} }

View File

@ -1,11 +1,11 @@
import classNames from 'classnames' import classNames from 'classnames'
import { useMemo } from 'react'
import { ChevronDown } from 'components/Icons' import { ChevronDown } from 'components/Icons'
import Text from 'components/Text' import Text from 'components/Text'
import AssetItem from 'components/Trade/TradeModule/AssetSelector/AssetItem' import AssetItem from 'components/Trade/TradeModule/AssetSelector/AssetItem'
import useCurrentAccount from 'hooks/useCurrentAccount' import useCurrentAccount from 'hooks/useCurrentAccount'
import useMarketAssets from 'hooks/useMarketAssets' import useMarketAssets from 'hooks/useMarketAssets'
import { useMemo } from 'react'
import { getMergedBalancesForAsset } from 'utils/accounts' import { getMergedBalancesForAsset } from 'utils/accounts'
import { byDenom } from 'utils/array' import { byDenom } from 'utils/array'
import { getEnabledMarketAssets } from 'utils/assets' import { getEnabledMarketAssets } from 'utils/assets'

View File

@ -1,6 +1,10 @@
import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate' import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'
import { useShuttle } from '@delphi-labs/shuttle-react' import {
import { useCallback, useEffect, useMemo } from 'react' useShuttle,
WalletExtensionProvider,
WalletMobileProvider,
} from '@delphi-labs/shuttle-react'
import { useCallback, useEffect, useMemo, useRef } from 'react'
import { CircularProgress } from 'components/CircularProgress' import { CircularProgress } from 'components/CircularProgress'
import FullOverlayContent from 'components/FullOverlayContent' import FullOverlayContent from 'components/FullOverlayContent'
@ -38,15 +42,21 @@ export default function WalletConnecting(props: Props) {
) )
const [isConnecting, setIsConnecting] = useToggle() const [isConnecting, setIsConnecting] = useToggle()
const providerId = props.providerId ?? recentWallet?.providerId const providerId = props.providerId ?? recentWallet?.providerId
const refTimer = useRef<number | null>(null)
const isAutoConnect = props.autoConnect const isAutoConnect = props.autoConnect
const client = useStore((s) => s.client) const client = useStore((s) => s.client)
const address = useStore((s) => s.address) const address = useStore((s) => s.address)
const clearTimer = useCallback(() => {
if (refTimer.current !== null) window.clearTimeout(refTimer.current)
}, [refTimer])
const handleConnect = useCallback( const handleConnect = useCallback(
(extensionProviderId: string) => { (extensionProviderId: string) => {
async function handleConnectAsync() { async function handleConnectAsync() {
if (client || isConnecting) return if (client || isConnecting) return
setIsConnecting(true) setIsConnecting(true)
clearTimer()
try { try {
const response = await connect({ extensionProviderId, chainId: currentChainId }) const response = await connect({ extensionProviderId, chainId: currentChainId })
const cosmClient = await CosmWasmClient.connect(response.network.rpc) const cosmClient = await CosmWasmClient.connect(response.network.rpc)
@ -70,7 +80,6 @@ export default function WalletConnecting(props: Props) {
}) })
} catch (error) { } catch (error) {
setIsConnecting(false) setIsConnecting(false)
if (isAutoConnect) return
if (error instanceof Error) { if (error instanceof Error) {
useStore.setState({ useStore.setState({
client: undefined, client: undefined,
@ -92,7 +101,15 @@ export default function WalletConnecting(props: Props) {
} }
if (!isConnecting) handleConnectAsync() if (!isConnecting) handleConnectAsync()
}, },
[broadcast, connect, client, isAutoConnect, isConnecting, setIsConnecting, sign, simulate], [broadcast, connect, client, isConnecting, setIsConnecting, sign, simulate, clearTimer],
)
const startTimer = useCallback(
(provider?: WalletMobileProvider | WalletExtensionProvider) => {
if (refTimer.current !== null || !window) return
refTimer.current = window.setTimeout(() => handleConnect(provider?.id ?? ''), 5000)
},
[refTimer, handleConnect],
) )
useEffect(() => { useEffect(() => {
@ -102,10 +119,25 @@ export default function WalletConnecting(props: Props) {
!provider.initialized || !provider.initialized ||
isConnecting || isConnecting ||
(recentWallet && recentWallet.account.address === address) (recentWallet && recentWallet.account.address === address)
) ) {
if (isAutoConnect) startTimer(provider)
return return
}
handleConnect(provider.id) handleConnect(provider.id)
}, [handleConnect, isConnecting, providerId, providers, recentWallet, address])
return () => clearTimer()
}, [
handleConnect,
isConnecting,
providerId,
providers,
recentWallet,
address,
isAutoConnect,
startTimer,
clearTimer,
])
return ( return (
<FullOverlayContent <FullOverlayContent

View File

@ -138,7 +138,7 @@ export default function WalletSelect(props: Props) {
return ( return (
<FullOverlayContent <FullOverlayContent
title={'Connect your wallet'} title={'Connect your wallet'}
copy={`Deposit assets from your ${currentChain.name} address to your Mars credit account.`} copy={`Deposit assets from your ${currentChain.name} address to your Mars Credit Account.`}
docs='wallet' docs='wallet'
> >
<div className='flex flex-wrap w-full gap-3'> <div className='flex flex-wrap w-full gap-3'>

View File

@ -1,3 +1,4 @@
import { useShuttle } from '@delphi-labs/shuttle-react'
import { useEffect } from 'react' import { useEffect } from 'react'
import WalletConnectButton from 'components/Wallet/WalletConnectButton' import WalletConnectButton from 'components/Wallet/WalletConnectButton'
@ -7,6 +8,7 @@ import useCurrentWallet from 'hooks/useCurrentWallet'
import useStore from 'store' import useStore from 'store'
export default function Wallet() { export default function Wallet() {
const { disconnectWallet } = useShuttle()
const currentWallet = useCurrentWallet() const currentWallet = useCurrentWallet()
const address = useStore((s) => s.address) const address = useStore((s) => s.address)
const focusComponent = useStore((s) => s.focusComponent) const focusComponent = useStore((s) => s.focusComponent)
@ -19,9 +21,19 @@ export default function Wallet() {
client: undefined, client: undefined,
focusComponent: { focusComponent: {
component: <WalletConnecting autoConnect />, component: <WalletConnecting autoConnect />,
onClose: () => {
disconnectWallet(currentWallet)
useStore.setState({
client: undefined,
address: undefined,
accounts: null,
balances: [],
focusComponent: null,
})
},
}, },
}) })
}, [currentWallet, address, focusComponent]) }, [currentWallet, address, focusComponent, disconnectWallet])
return address ? <WalletConnectedButton /> : <WalletConnectButton /> return address ? <WalletConnectedButton /> : <WalletConnectButton />
} }

View File

@ -4,8 +4,8 @@ import { ChainInfoID } from 'types/enums/wallet'
export const CHAINS: ChainInfos = { export const CHAINS: ChainInfos = {
[ChainInfoID.Osmosis1]: { [ChainInfoID.Osmosis1]: {
rpc: 'https://rpc-osmosis.blockapsis.com', rpc: 'https://rpc.osmosis.zone',
rest: 'https://lcd-osmosis.blockapsis.com', rest: 'https://lcd.osmosis.zone',
explorer: 'https://www.mintscan.io/osmosis', explorer: 'https://www.mintscan.io/osmosis',
explorerName: 'Mintscan', explorerName: 'Mintscan',
chainId: ChainInfoID.Osmosis1, chainId: ChainInfoID.Osmosis1,

283
yarn.lock
View File

@ -2470,38 +2470,38 @@
"@jridgewell/resolve-uri" "3.1.0" "@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14" "@jridgewell/sourcemap-codec" "1.4.14"
"@keplr-wallet/common@0.12.28": "@keplr-wallet/common@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/common/-/common-0.12.28.tgz#1d5d985070aced31a34a6426c9ac4b775081acca" resolved "https://registry.yarnpkg.com/@keplr-wallet/common/-/common-0.12.32.tgz#3dab2ddf58943fb457e9ded76262ea4c5c262201"
integrity sha512-ESQorPZw8PRiUXhsrxED+E1FEWkAdc6Kwi3Az7ce204gMBQDI2j0XJtTd4uCUp+C24Em9fk0samdHzdoB4caIg== integrity sha512-GWMsuk4Sam/QXwNHbJ8sOTB1piRHMZMkMaZEdIVbWUDFn0Dun6gRD4hrDSAUohgPCcJ5Vk350eCf6P2q1KhWbQ==
dependencies: dependencies:
"@keplr-wallet/crypto" "0.12.28" "@keplr-wallet/crypto" "0.12.32"
"@keplr-wallet/types" "0.12.28" "@keplr-wallet/types" "0.12.32"
buffer "^6.0.3" buffer "^6.0.3"
delay "^4.4.0" delay "^4.4.0"
mobx "^6.1.7" mobx "^6.1.7"
"@keplr-wallet/cosmos@^0.12.28": "@keplr-wallet/cosmos@^0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/cosmos/-/cosmos-0.12.28.tgz#d56e73468256e7276a66bb41f145449dbf11efa1" resolved "https://registry.yarnpkg.com/@keplr-wallet/cosmos/-/cosmos-0.12.32.tgz#2a3f5765ede059d87dbda7b20de69c9bb0312a13"
integrity sha512-IuqmSBgKgIeWBA0XGQKKs28IXFeFMCrfadCbtiZccNc7qnNr5Y/Cyyk01BPC8Dd1ZyEyAByoICgrxvtGN0GGvA== integrity sha512-gB90blTgvMhRi7yGk0onGd1Q+g3KmyQYakARjieT7zG3nhNe2eB+xMcGlPlmzCsbEb/7Olkx55s9DfnbMHJMDA==
dependencies: dependencies:
"@ethersproject/address" "^5.6.0" "@ethersproject/address" "^5.6.0"
"@keplr-wallet/common" "0.12.28" "@keplr-wallet/common" "0.12.32"
"@keplr-wallet/crypto" "0.12.28" "@keplr-wallet/crypto" "0.12.32"
"@keplr-wallet/proto-types" "0.12.28" "@keplr-wallet/proto-types" "0.12.32"
"@keplr-wallet/simple-fetch" "0.12.28" "@keplr-wallet/simple-fetch" "0.12.32"
"@keplr-wallet/types" "0.12.28" "@keplr-wallet/types" "0.12.32"
"@keplr-wallet/unit" "0.12.28" "@keplr-wallet/unit" "0.12.32"
bech32 "^1.1.4" bech32 "^1.1.4"
buffer "^6.0.3" buffer "^6.0.3"
long "^4.0.0" long "^4.0.0"
protobufjs "^6.11.2" protobufjs "^6.11.2"
"@keplr-wallet/crypto@0.12.28": "@keplr-wallet/crypto@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/crypto/-/crypto-0.12.28.tgz#28410ba1f707fa5a1506f111f6fd8baf071c394d" resolved "https://registry.yarnpkg.com/@keplr-wallet/crypto/-/crypto-0.12.32.tgz#a8c12ae48372ac73c84dd4fcba91b5e0e651342c"
integrity sha512-le1je+78/4213qshSMgQTYqhCCvzsL9+YfhjXg1kd/ali69MLWK8L8Z09ducHPS6C+LqQXXTNJQpbH2uiFSd5w== integrity sha512-BpsznV8qiStvoq/KAQEC/NDAVP6qL/gblNB7aF0m9DaFYHC42tj4CPK65DejCeMOZB217ACRXHKZRhrwg913gQ==
dependencies: dependencies:
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.5.0"
bip32 "^2.0.6" bip32 "^2.0.6"
@ -2512,32 +2512,32 @@
elliptic "^6.5.3" elliptic "^6.5.3"
sha.js "^2.4.11" sha.js "^2.4.11"
"@keplr-wallet/proto-types@0.12.28": "@keplr-wallet/proto-types@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/proto-types/-/proto-types-0.12.28.tgz#2fb2c37749ce7db974f01d07387e966c9b99027d" resolved "https://registry.yarnpkg.com/@keplr-wallet/proto-types/-/proto-types-0.12.32.tgz#313517d0dd7b3561d52c75315a95d1e6db438a0c"
integrity sha512-ukti/eCTltPUP64jxtk5TjtwJogyfKPqlBIT3KGUCGzBLIPeYMsffL5w5aoHsMjINzOITjYqzXyEF8LTIK/fmw== integrity sha512-wlB6L2/+rn+yr4I6ow91HtUGPn6gh1uosvhcwI/66vB9g+OtCRg0dFz+ZkL5/ZPpzWLFSDfPt50aAxXW3oN3Pg==
dependencies: dependencies:
long "^4.0.0" long "^4.0.0"
protobufjs "^6.11.2" protobufjs "^6.11.2"
"@keplr-wallet/simple-fetch@0.12.28": "@keplr-wallet/simple-fetch@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/simple-fetch/-/simple-fetch-0.12.28.tgz#44225df5b329c823076280df1ec9930a21b1373e" resolved "https://registry.yarnpkg.com/@keplr-wallet/simple-fetch/-/simple-fetch-0.12.32.tgz#641418bb38875642b11cc45033f57a3e937b3414"
integrity sha512-T2CiKS2B5n0ZA7CWw0CA6qIAH0XYI1siE50MP+i+V0ZniCGBeL+BMcDw64vFJUcEH+1L5X4sDAzV37fQxGwllA== integrity sha512-bSCb4oho4VKrCkQOHBrkrMji/jvU+CQ7Lugw4bAzyn5EvPPR7Yx1GZ295r/KQwphUdOHhzfTovE8GeyTIvKI0Q==
"@keplr-wallet/types@0.12.28": "@keplr-wallet/types@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.12.28.tgz#eac3c2c9d4560856c5c403a87e67925992a04fbf" resolved "https://registry.yarnpkg.com/@keplr-wallet/types/-/types-0.12.32.tgz#6141500f7387cde0512d4f87cab3686ee9f67db3"
integrity sha512-EcM9d46hYDm3AO4lf4GUbTSLRySONtTmhKb7p88q56OQOgJN3MMjRacEo2p9jX9gpPe7gRIjMUalhAfUiFpZoQ== integrity sha512-uxTz2Tidmob12dy0Hp+posGkm9WFW5sFSpVenIX6geRIfJwgpApDWZ1oD4NtRPy8s5aa51DirJceSuIYz+fx1g==
dependencies: dependencies:
long "^4.0.0" long "^4.0.0"
"@keplr-wallet/unit@0.12.28": "@keplr-wallet/unit@0.12.32":
version "0.12.28" version "0.12.32"
resolved "https://registry.yarnpkg.com/@keplr-wallet/unit/-/unit-0.12.28.tgz#907c7fa0b49a729cda207fca14fc0a38871cc6c4" resolved "https://registry.yarnpkg.com/@keplr-wallet/unit/-/unit-0.12.32.tgz#b5d16599f0fb944ba82558a546f7ce706877b0b3"
integrity sha512-kpXigHDBJGOmhtPkv9hqsQid9zkFo7OQPeKgO2n8GUlOINIXW6kWG5LXYTi/Yg9Uiw1CQF69gFMuZCJ8IzVHlA== integrity sha512-ipaUV0RtUjn3W9ULIhndXwq0tz7mWwGSg1iTZgNbBSBT/5Q14ZjS+U6wvZY5oFg1pmHyQSXzEhlRQFtfzA35Gg==
dependencies: dependencies:
"@keplr-wallet/types" "0.12.28" "@keplr-wallet/types" "0.12.32"
big-integer "^1.6.48" big-integer "^1.6.48"
utility-types "^3.10.0" utility-types "^3.10.0"
@ -2564,62 +2564,62 @@
tweetnacl "^1.0.3" tweetnacl "^1.0.3"
tweetnacl-util "^0.15.1" tweetnacl-util "^0.15.1"
"@next/env@13.5.3": "@next/env@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.3.tgz#402da9a0af87f93d853519f0c2a602b1ab637c2c" resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.4.tgz#777c3af16de2cf2f611b6c8126910062d13d222c"
integrity sha512-X4te86vsbjsB7iO4usY9jLPtZ827Mbx+WcwNBGUOIuswuTAKQtzsuoxc/6KLxCMvogKG795MhrR1LDhYgDvasg== integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==
"@next/eslint-plugin-next@13.5.3": "@next/eslint-plugin-next@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.3.tgz#585fca48fb5f969825ad57f05c0a627fd4662dda" resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz#ec70af509f07dc4e545df25834ac94d2c341c36a"
integrity sha512-lbZOoEjzSuTtpk9UgV9rOmxYw+PsSfNR+00mZcInqooiDMZ1u+RqT1YQYLsEZPW1kumZoQe5+exkCBtZ2xn0uw== integrity sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==
dependencies: dependencies:
glob "7.1.7" glob "7.1.7"
"@next/swc-darwin-arm64@13.5.3": "@next/swc-darwin-arm64@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.3.tgz#f72eac8c7b71d33e0768bd3c8baf68b00fea0160" resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz#241957774fef3f876dc714cfc0ca6f00f561737e"
integrity sha512-6hiYNJxJmyYvvKGrVThzo4nTcqvqUTA/JvKim7Auaj33NexDqSNwN5YrrQu+QhZJCIpv2tULSHt+lf+rUflLSw== integrity sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==
"@next/swc-darwin-x64@13.5.3": "@next/swc-darwin-x64@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.3.tgz#96eda3a1247a713579eb241d76d3f503291c8938" resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz#fa11bb97bf06cd45cbd554354b46bf93e22c025b"
integrity sha512-UpBKxu2ob9scbpJyEq/xPgpdrgBgN3aLYlxyGqlYX5/KnwpJpFuIHU2lx8upQQ7L+MEmz+fA1XSgesoK92ppwQ== integrity sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==
"@next/swc-linux-arm64-gnu@13.5.3": "@next/swc-linux-arm64-gnu@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.3.tgz#132e155a029310fffcdfd3e3c4255f7ce9fd2714" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz#dd3a482cd6871ed23b049066a0f3c4c2f955dc88"
integrity sha512-5AzM7Yx1Ky+oLY6pHs7tjONTF22JirDPd5Jw/3/NazJ73uGB05NqhGhB4SbeCchg7SlVYVBeRMrMSZwJwq/xoA== integrity sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==
"@next/swc-linux-arm64-musl@13.5.3": "@next/swc-linux-arm64-musl@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.3.tgz#981d7d8fdcf040bd0c89588ef4139c28805f5cf1" resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz#ed6d7abaf5712cff2752ce5300d6bacc6aff1b18"
integrity sha512-A/C1shbyUhj7wRtokmn73eBksjTM7fFQoY2v/0rTM5wehpkjQRLOXI8WJsag2uLhnZ4ii5OzR1rFPwoD9cvOgA== integrity sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==
"@next/swc-linux-x64-gnu@13.5.3": "@next/swc-linux-x64-gnu@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.3.tgz#b8263663acda7b84bc2c4ffa39ca4b0172a78060" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz#977a040388e8a685a3a85e0dbdff90a4ee2a7189"
integrity sha512-FubPuw/Boz8tKkk+5eOuDHOpk36F80rbgxlx4+xty/U71e3wZZxVYHfZXmf0IRToBn1Crb8WvLM9OYj/Ur815g== integrity sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==
"@next/swc-linux-x64-musl@13.5.3": "@next/swc-linux-x64-musl@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.3.tgz#cd0bed8ee92032c25090bed9d95602ac698d925f" resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz#3e29a0ad8efc016196c3a120da04397eea328b2a"
integrity sha512-DPw8nFuM1uEpbX47tM3wiXIR0Qa+atSzs9Q3peY1urkhofx44o7E1svnq+a5Q0r8lAcssLrwiM+OyJJgV/oj7g== integrity sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==
"@next/swc-win32-arm64-msvc@13.5.3": "@next/swc-win32-arm64-msvc@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.3.tgz#7f556674ca97e6936220d10c58252cc36522d80a" resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz#18a236c3fe5a48d24b56d939e6a05488bb682b7e"
integrity sha512-zBPSP8cHL51Gub/YV8UUePW7AVGukp2D8JU93IHbVDu2qmhFAn9LWXiOOLKplZQKxnIPUkJTQAJDCWBWU4UWUA== integrity sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==
"@next/swc-win32-ia32-msvc@13.5.3": "@next/swc-win32-ia32-msvc@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.3.tgz#4912721fb8695f11daec4cde42e73dc57bcc479f" resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz#255132243ab6fb20d3c7c92a585e2c4fa50368fe"
integrity sha512-ONcL/lYyGUj4W37D4I2I450SZtSenmFAvapkJQNIJhrPMhzDU/AdfLkW98NvH1D2+7FXwe7yclf3+B7v28uzBQ== integrity sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==
"@next/swc-win32-x64-msvc@13.5.3": "@next/swc-win32-x64-msvc@13.5.4":
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.3.tgz#97340a709febb60ff73003566b99d127d4e5b881" resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz#cc542907b55247c5634d9a8298e1c143a1847e25"
integrity sha512-2Vz2tYWaLqJvLcWbbTlJ5k9AN6JD7a5CN2pAeIzpbecK8ZF/yobA39cXtv6e+Z8c5UJuVOmaTldEAIxvsIux/Q== integrity sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==
"@noble/curves@1.1.0", "@noble/curves@~1.1.0": "@noble/curves@1.1.0", "@noble/curves@~1.1.0":
version "1.1.0" version "1.1.0"
@ -3026,10 +3026,10 @@
lodash.debounce "^4.0.8" lodash.debounce "^4.0.8"
react-merge-refs "^2.0.1" react-merge-refs "^2.0.1"
"@splinetool/runtime@^0.9.473": "@splinetool/runtime@^0.9.477":
version "0.9.473" version "0.9.477"
resolved "https://registry.yarnpkg.com/@splinetool/runtime/-/runtime-0.9.473.tgz#923f76f5c7490b42ad1e605784b8ead69dd3bd39" resolved "https://registry.yarnpkg.com/@splinetool/runtime/-/runtime-0.9.477.tgz#62ce32197cb4671bc522638addf94baf539eddec"
integrity sha512-6XXp+rI6YHijQyh+gNQPx3HivBO/1Q63AAzaHJr6AteguJsEieIJZI/7bzAoa/NwtPXXnm/+M5brtJ9NtPPlyg== integrity sha512-zb2+zh1uPH4h3EbVYJmoiC9iuD1FmQJGCzifPQICpQ9VSKVk/4wDLgaoCTXqME/kbx5XERkGh+kmOAGTBkOsxQ==
dependencies: dependencies:
on-change "^4.0.0" on-change "^4.0.0"
semver-compare "^1.0.0" semver-compare "^1.0.0"
@ -3281,17 +3281,17 @@
dependencies: dependencies:
tslib "^2.4.0" tslib "^2.4.0"
"@tanstack/react-table@^8.10.3": "@tanstack/react-table@^8.10.6":
version "8.10.3" version "8.10.6"
resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.10.3.tgz#d109be13ffca4085336e92b4a856bddc1ddfebd8" resolved "https://registry.yarnpkg.com/@tanstack/react-table/-/react-table-8.10.6.tgz#a8c03cc06ac890bce4404739b9356059c4259dd4"
integrity sha512-Qya1cJ+91arAlW7IRDWksRDnYw28O446jJ/ljkRSc663EaftJoBCAU10M+VV1K6MpCBLrXq1BD5IQc1zj/ZEjA== integrity sha512-D0VEfkIYnIKdy6SHiBNEaMc4SxO+MV7ojaPhRu8jP933/gbMi367+Wul2LxkdovJ5cq6awm0L1+jgxdS/unzIg==
dependencies: dependencies:
"@tanstack/table-core" "8.10.3" "@tanstack/table-core" "8.10.6"
"@tanstack/table-core@8.10.3": "@tanstack/table-core@8.10.6":
version "8.10.3" version "8.10.6"
resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.10.3.tgz#7f7a0753645e05bb15c97512785abbae7b626ee3" resolved "https://registry.yarnpkg.com/@tanstack/table-core/-/table-core-8.10.6.tgz#c79d145dfc3dc9947a2b1cdac82cd4ec4cef822a"
integrity sha512-hJ55YfJlWbfzRROfcyA/kC1aZr/shsLA8XNAwN8jXylhYWGLnPmiJJISrUfj4dMMWRiFi0xBlnlC7MLH+zSrcw== integrity sha512-9t8brthhAmCBIjzk7fCDa/kPKoLQTtA31l9Ir76jYxciTlHU61r/6gYm69XF9cbg9n88gVL5y7rNpeJ2dc1AFA==
"@terra-money/terra.proto@^3.0.5": "@terra-money/terra.proto@^3.0.5":
version "3.0.5" version "3.0.5"
@ -3577,7 +3577,14 @@
resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz"
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
"@types/react-dom@18.2.11", "@types/react-dom@^18.0.0": "@types/react-dom@18.2.13":
version "18.2.13"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.13.tgz#89cd7f9ec8b28c8b6f0392b9591671fb4a9e96b7"
integrity sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==
dependencies:
"@types/react" "*"
"@types/react-dom@^18.0.0":
version "18.2.11" version "18.2.11"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58"
integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg== integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg==
@ -3591,10 +3598,19 @@
dependencies: dependencies:
"@types/react" "*" "@types/react" "*"
"@types/react@*", "@types/react@18.2.23": "@types/react@*":
version "18.2.23" version "18.2.27"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.23.tgz#60ad6cf4895e93bed858db0e03bcc4ff97d0410e" resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.27.tgz#746e52b06f3ccd5d7a724fd53769b70792601440"
integrity sha512-qHLW6n1q2+7KyBEYnrZpcsAmU/iiCh9WGCKgXvMxx89+TYdJWRjZohVIo9XTcoLhfX3+/hP0Pbulu3bCZQ9PSA== integrity sha512-Wfv7B7FZiR2r3MIqbAlXoY1+tXm4bOqfz4oRr+nyXdBqapDBZ0l/IGcSlAfvxIHEEJjkPU0MYAc/BlFPOcrgLw==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@18.2.28":
version "18.2.28"
resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.28.tgz#86877465c0fcf751659a36c769ecedfcfacee332"
integrity sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==
dependencies: dependencies:
"@types/prop-types" "*" "@types/prop-types" "*"
"@types/scheduler" "*" "@types/scheduler" "*"
@ -5554,12 +5570,12 @@ escodegen@^2.0.0:
optionalDependencies: optionalDependencies:
source-map "~0.6.1" source-map "~0.6.1"
eslint-config-next@^13.5.3: eslint-config-next@^13.5.4:
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.5.3.tgz#f1ff64e4a5b55ce52ef0ab0ea85de04fd581b956" resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.5.4.tgz#e50bb157d8346b63426f4b36bf53c2e46ccbc938"
integrity sha512-VN2qbCpq2DMWgs7SVF8KTmc8bVaWz3s4nmcFqRLs7PNBt5AXejOhJuZ4zg2sCEHOvz5RvqdwLeI++NSCV6qHVg== integrity sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==
dependencies: dependencies:
"@next/eslint-plugin-next" "13.5.3" "@next/eslint-plugin-next" "13.5.4"
"@rushstack/eslint-patch" "^1.3.3" "@rushstack/eslint-patch" "^1.3.3"
"@typescript-eslint/parser" "^5.4.2 || ^6.0.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0"
eslint-import-resolver-node "^0.3.6" eslint-import-resolver-node "^0.3.6"
@ -5683,7 +5699,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@8.51.0: eslint@^8.51.0:
version "8.51.0" version "8.51.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3" resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.51.0.tgz#4a82dae60d209ac89a5cff1604fea978ba4950f3"
integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA== integrity sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==
@ -7748,7 +7764,7 @@ nan@^2.13.2, nan@^2.14.0:
resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz"
integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==
nanoid@^3.3.4, nanoid@^3.3.6: nanoid@^3.3.6:
version "3.3.6" version "3.3.6"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
@ -7758,29 +7774,28 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
next@13.5.3: next@^13.5.4:
version "13.5.3" version "13.5.4"
resolved "https://registry.yarnpkg.com/next/-/next-13.5.3.tgz#631efcbcc9d756c610855d9b94f3d8c4e73ee131" resolved "https://registry.yarnpkg.com/next/-/next-13.5.4.tgz#7e6a93c9c2b9a2c78bf6906a6c5cc73ae02d5b4d"
integrity sha512-4Nt4HRLYDW/yRpJ/QR2t1v63UOMS55A38dnWv3UDOWGezuY0ZyFO1ABNbD7mulVzs9qVhgy2+ppjdsANpKP1mg== integrity sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==
dependencies: dependencies:
"@next/env" "13.5.3" "@next/env" "13.5.4"
"@swc/helpers" "0.5.2" "@swc/helpers" "0.5.2"
busboy "1.6.0" busboy "1.6.0"
caniuse-lite "^1.0.30001406" caniuse-lite "^1.0.30001406"
postcss "8.4.14" postcss "8.4.31"
styled-jsx "5.1.1" styled-jsx "5.1.1"
watchpack "2.4.0" watchpack "2.4.0"
zod "3.21.4"
optionalDependencies: optionalDependencies:
"@next/swc-darwin-arm64" "13.5.3" "@next/swc-darwin-arm64" "13.5.4"
"@next/swc-darwin-x64" "13.5.3" "@next/swc-darwin-x64" "13.5.4"
"@next/swc-linux-arm64-gnu" "13.5.3" "@next/swc-linux-arm64-gnu" "13.5.4"
"@next/swc-linux-arm64-musl" "13.5.3" "@next/swc-linux-arm64-musl" "13.5.4"
"@next/swc-linux-x64-gnu" "13.5.3" "@next/swc-linux-x64-gnu" "13.5.4"
"@next/swc-linux-x64-musl" "13.5.3" "@next/swc-linux-x64-musl" "13.5.4"
"@next/swc-win32-arm64-msvc" "13.5.3" "@next/swc-win32-arm64-msvc" "13.5.4"
"@next/swc-win32-ia32-msvc" "13.5.3" "@next/swc-win32-ia32-msvc" "13.5.4"
"@next/swc-win32-x64-msvc" "13.5.3" "@next/swc-win32-x64-msvc" "13.5.4"
no-case@^3.0.4: no-case@^3.0.4:
version "3.0.4" version "3.0.4"
@ -8211,12 +8226,12 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@8.4.14: postcss@8.4.31:
version "8.4.14" version "8.4.31"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
dependencies: dependencies:
nanoid "^3.3.4" nanoid "^3.3.6"
picocolors "^1.0.0" picocolors "^1.0.0"
source-map-js "^1.0.2" source-map-js "^1.0.2"
@ -10142,14 +10157,16 @@ zen-observable@0.8.15:
resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz" resolved "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==
zod@3.21.4: zustand@^4.3.8:
version "3.21.4"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db"
integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==
zustand@^4.3.8, zustand@^4.4.1:
version "4.4.1" version "4.4.1"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.1.tgz#0cd3a3e4756f21811bd956418fdc686877e8b3b0"
integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw== integrity sha512-QCPfstAS4EBiTQzlaGP1gmorkh/UL1Leaj2tdj+zZCZ/9bm0WS7sI2wnfD5lpOszFqWJ1DcPnGoY8RDL61uokw==
dependencies: dependencies:
use-sync-external-store "1.2.0" use-sync-external-store "1.2.0"
zustand@^4.4.3:
version "4.4.3"
resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.4.3.tgz#1d54cf7fa4507ad8bf58e2f13e08ddc8a6730128"
integrity sha512-oRy+X3ZazZvLfmv6viIaQmtLOMeij1noakIsK/Y47PWYhT8glfXzQ4j0YcP5i0P0qI1A4rIB//SGROGyZhx91A==
dependencies:
use-sync-external-store "1.2.0"