merge main

This commit is contained in:
saml33 2023-02-06 10:10:23 +11:00
commit 581a7a9cb1
24 changed files with 335 additions and 188 deletions

View File

@ -70,7 +70,7 @@ const TokenList = () => {
} }
return ( return (
<ContentBox hideBorder hidePadding className=""> <ContentBox hideBorder hidePadding>
<div className="flex w-full items-center justify-end border-b border-th-bkg-3 py-3 px-6 lg:-mt-[36px] lg:mb-4 lg:w-auto lg:border-0 lg:py-0"> <div className="flex w-full items-center justify-end border-b border-th-bkg-3 py-3 px-6 lg:-mt-[36px] lg:mb-4 lg:w-auto lg:border-0 lg:py-0">
<Switch <Switch
checked={showZeroBalances} checked={showZeroBalances}

View File

@ -94,14 +94,14 @@ const AccountActions = () => {
appear={true} appear={true}
show={open} show={open}
as={Fragment} as={Fragment}
enter="transition ease-in duration-200" enter="transition ease-in duration-75"
enterFrom="opacity-0 scale-75" enterFrom="opacity-0 nice scale-75"
enterTo="opacity-100 scale-100" enterTo="opacity-100 scale-100"
leave="transition ease-out duration-200" leave="transition ease-out duration-100"
leaveFrom="opacity-100" leaveFrom="opacity-100"
leaveTo="opacity-0" leaveTo="opacity-0"
> >
<Popover.Panel className="absolute right-0 top-10 mt-1 space-y-1.5 rounded-md bg-th-bkg-2 px-4 py-2.5"> <Popover.Panel className="absolute right-0 top-10 mt-1 space-y-2 rounded-md bg-th-bkg-2 px-4 py-2.5">
<ActionsLinkButton <ActionsLinkButton
mangoAccount={mangoAccount!} mangoAccount={mangoAccount!}
onClick={() => onClick={() =>

View File

@ -42,6 +42,7 @@ import { breakpoints } from 'utils/theme'
import useMangoGroup from 'hooks/useMangoGroup' import useMangoGroup from 'hooks/useMangoGroup'
import PnlHistoryModal from '@components/modals/PnlHistoryModal' import PnlHistoryModal from '@components/modals/PnlHistoryModal'
import FormatNumericValue from '@components/shared/FormatNumericValue' import FormatNumericValue from '@components/shared/FormatNumericValue'
import HealthBar from './HealthBar'
const AccountPage = () => { const AccountPage = () => {
const { t } = useTranslation(['common', 'account']) const { t } = useTranslation(['common', 'account'])
@ -327,7 +328,7 @@ const AccountPage = () => {
</div> </div>
</div> </div>
<div className="grid grid-cols-5 border-b border-th-bkg-3"> <div className="grid grid-cols-5 border-b border-th-bkg-3">
<div className="col-span-5 flex border-t border-th-bkg-3 py-3 pl-6 lg:col-span-1 lg:border-t-0"> <div className="col-span-5 border-t border-th-bkg-3 py-3 px-6 lg:col-span-1 lg:border-t-0">
<div id="account-step-four"> <div id="account-step-four">
<Tooltip <Tooltip
maxWidth="20rem" maxWidth="20rem"
@ -368,9 +369,10 @@ const AccountPage = () => {
{t('health')} {t('health')}
</p> </p>
</Tooltip> </Tooltip>
<p className="mt-1 text-2xl font-bold text-th-fgd-1 lg:text-xl xl:text-2xl"> <p className="mt-1 mb-2 text-2xl font-bold text-th-fgd-1 lg:text-xl xl:text-2xl">
{maintHealth}% {maintHealth}%
</p> </p>
<HealthBar health={maintHealth} />
</div> </div>
</div> </div>
<div className="col-span-5 flex border-t border-th-bkg-3 py-3 pl-6 lg:col-span-1 lg:border-l lg:border-t-0"> <div className="col-span-5 flex border-t border-th-bkg-3 py-3 pl-6 lg:col-span-1 lg:border-l lg:border-t-0">

View File

@ -0,0 +1,69 @@
import { useMemo } from 'react'
const HealthBar = ({ health }: { health: number }) => {
const [barWidths, fillColor] = useMemo(() => {
if (!health) return [[2, 0, 0, 0], 'var(--down)']
if (health <= 25) {
const fillWidth = (health / 25) * 100
return [[fillWidth, 0, 0, 0], 'var(--down)']
}
if (health <= 50) {
const fillWidth = ((health - 25) / 25) * 100
return [[100, fillWidth, 0, 0], 'var(--warning)']
}
if (health <= 75) {
const fillWidth = ((health - 50) / 25) * 100
return [[100, 100, fillWidth, 0], 'var(--up)']
}
const fillWidth = ((health - 75) / 25) * 100
return [[100, 100, 100, fillWidth], 'var(--up)']
}, [health])
const sharedStyles = {
background: fillColor,
boxShadow: `0px 0px 8px 0px ${fillColor}`,
}
return (
<div className="grid w-full grid-cols-4 gap-1">
<div className="col-span-1 flex h-1 rounded-full bg-th-bkg-3">
<div
style={{
...sharedStyles,
width: `${barWidths[0]}%`,
}}
className={`flex rounded-full`}
/>
</div>
<div className="col-span-1 flex h-1 rounded-full bg-th-bkg-3">
<div
style={{
...sharedStyles,
width: `${barWidths[1]}%`,
}}
className={`flex rounded-full`}
/>
</div>
<div className="col-span-1 flex h-1 rounded-full bg-th-bkg-3">
<div
style={{
...sharedStyles,
width: `${barWidths[2]}%`,
}}
className={`flex rounded-full`}
/>
</div>
<div className="col-span-1 flex h-1 rounded-full bg-th-bkg-3">
<div
style={{
...sharedStyles,
width: `${barWidths[3]}%`,
}}
className={`flex rounded-full`}
/>
</div>
</div>
)
}
export default HealthBar

View File

@ -1,3 +1,5 @@
import { useMemo } from 'react'
const HealthHeart = ({ const HealthHeart = ({
health, health,
size, size,
@ -5,7 +7,23 @@ const HealthHeart = ({
health: number | undefined health: number | undefined
size: number size: number
}) => { }) => {
const fillColor = useMemo(() => {
if (!health) return 'var(--fgd-4)'
if (health <= 25) {
return 'var(--down)'
}
if (health <= 50) {
return 'var(--warning)'
}
if (health <= 75) {
return 'var(--up)'
}
return 'var(--up)'
}, [health])
const styles = { const styles = {
color: fillColor,
// filter: `drop-shadow(0px 0px 8px ${fillColor})`,
height: `${size}px`, height: `${size}px`,
width: `${size}px`, width: `${size}px`,
} }
@ -14,15 +32,6 @@ const HealthHeart = ({
<svg <svg
id="account-step-eleven" id="account-step-eleven"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
className={
health
? health > 15 && health < 50
? 'text-th-warning'
: health >= 50
? 'text-th-success'
: 'text-th-error'
: 'text-th-fgd-4'
}
style={styles} style={styles}
viewBox="0 0 20 20" viewBox="0 0 20 20"
fill="currentColor" fill="currentColor"
@ -33,7 +42,7 @@ const HealthHeart = ({
d="M3.172 5.172a4 4 0 015.656 0L10 6.343l1.172-1.171a4 4 0 115.656 5.656L10 17.657l-6.828-6.829a4 4 0 010-5.656z" d="M3.172 5.172a4 4 0 015.656 0L10 6.343l1.172-1.171a4 4 0 115.656 5.656L10 17.657l-6.828-6.829a4 4 0 010-5.656z"
clipRule="evenodd" clipRule="evenodd"
/> />
<animateTransform {/* <animateTransform
attributeName="transform" attributeName="transform"
type="scale" type="scale"
keyTimes="0;0.5;1" keyTimes="0;0.5;1"
@ -62,7 +71,7 @@ const HealthHeart = ({
: '0s' : '0s'
} }
repeatCount="indefinite" repeatCount="indefinite"
/> /> */}
</g> </g>
</svg> </svg>
) )

View File

@ -52,10 +52,11 @@ const MangoAccountsListModal = ({
if (!group) return mangoAccounts if (!group) return mangoAccounts
return [...mangoAccounts].sort((a, b) => { return [...mangoAccounts].sort((a, b) => {
if (b.publicKey.toString() === mangoAccount?.publicKey.toString()) // keeps the current selected mango account at the top of the list
return 1 // if (b.publicKey.toString() === mangoAccount?.publicKey.toString())
if (a.publicKey.toString() === mangoAccount?.publicKey.toString()) // return 1
return -1 // if (a.publicKey.toString() === mangoAccount?.publicKey.toString())
// return -1
return b.getEquity(group).toNumber() - a.getEquity(group).toNumber() return b.getEquity(group).toNumber() - a.getEquity(group).toNumber()
}) })
}, [group, mangoAccounts]) }, [group, mangoAccounts])

View File

@ -26,6 +26,8 @@ export const PRIORITY_FEES = [
{ label: 'High', value: 100000 }, { label: 'High', value: 100000 },
] ]
export const DEFAULT_PRIORITY_FEE = PRIORITY_FEES[1]
const RpcSettings = () => { const RpcSettings = () => {
const { t } = useTranslation('settings') const { t } = useTranslation('settings')
const actions = mangoStore.getState().actions const actions = mangoStore.getState().actions
@ -38,7 +40,7 @@ const RpcSettings = () => {
) )
const [storedPriorityFee, setStoredPriorityFee] = useLocalStorageState( const [storedPriorityFee, setStoredPriorityFee] = useLocalStorageState(
PRIORITY_FEE_KEY, PRIORITY_FEE_KEY,
PRIORITY_FEES[2].value DEFAULT_PRIORITY_FEE.value
) )
const rpcEndpoint = useMemo(() => { const rpcEndpoint = useMemo(() => {
@ -53,7 +55,7 @@ const RpcSettings = () => {
const priorityFee = useMemo(() => { const priorityFee = useMemo(() => {
return ( return (
PRIORITY_FEES.find((node) => node.value === storedPriorityFee) || PRIORITY_FEES.find((node) => node.value === storedPriorityFee) ||
PRIORITY_FEES[2] DEFAULT_PRIORITY_FEE
) )
}, [storedPriorityFee]) }, [storedPriorityFee])

View File

@ -331,12 +331,14 @@ const DetailedAreaChart: FunctionComponent<DetailedAreaChartProps> = ({
domain domain
? domain ? domain
: ([dataMin, dataMax]) => { : ([dataMin, dataMax]) => {
const absMax = Math.max( const difference =
Math.abs(dataMin), Math.abs(dataMax) - Math.abs(dataMin)
Math.abs(dataMax) if (difference < 0.1) {
)
if (absMax < 1) {
return [dataMin - 0.01, dataMax + 0.01] return [dataMin - 0.01, dataMax + 0.01]
} else if (difference < 1) {
return [dataMin - 1, dataMax + 1]
} else if (difference < 10) {
return [dataMin - 10, dataMax + 10]
} else { } else {
return [dataMin, dataMax] return [dataMin, dataMax]
} }

View File

@ -43,9 +43,13 @@ const SimpleAreaChart = ({
<XAxis dataKey={xKey} hide /> <XAxis dataKey={xKey} hide />
<YAxis <YAxis
domain={([dataMin, dataMax]) => { domain={([dataMin, dataMax]) => {
const absMax = Math.max(Math.abs(dataMin), Math.abs(dataMax)) const difference = Math.abs(dataMax) - Math.abs(dataMin)
if (absMax < 1) { if (difference < 0.1) {
return [dataMin - 0.01, dataMax + 0.01] return [dataMin - 0.01, dataMax + 0.01]
} else if (difference < 1) {
return [dataMin - 1, dataMax + 1]
} else if (difference < 10) {
return [dataMin - 10, dataMax + 10]
} else { } else {
return [dataMin, dataMax] return [dataMin, dataMax]
} }

View File

@ -7,11 +7,7 @@ export const Table = ({
}: { }: {
children: ReactNode children: ReactNode
className?: string className?: string
}) => ( }) => <table className={`m-0 min-w-full p-0 ${className}`}>{children}</table>
<div className="thin-scroll overflow-x-auto">
<table className={`m-0 min-w-full p-0 ${className}`}>{children}</table>
</div>
)
export const TrHead = ({ export const TrHead = ({
children, children,

View File

@ -7,7 +7,7 @@ import FormatNumericValue from '@components/shared/FormatNumericValue'
type RoutesModalProps = { type RoutesModalProps = {
onClose: () => void onClose: () => void
setSelectedRoute: Dispatch<SetStateAction<RouteInfo | undefined>> setSelectedRoute: Dispatch<SetStateAction<RouteInfo | undefined | null>>
show: boolean show: boolean
routes: RouteInfo[] routes: RouteInfo[]
selectedRoute: RouteInfo selectedRoute: RouteInfo

View File

@ -47,6 +47,7 @@ import PercentageSelectButtons from './PercentageSelectButtons'
import useIpAddress from 'hooks/useIpAddress' import useIpAddress from 'hooks/useIpAddress'
import { useEnhancedWallet } from '@components/wallet/EnhancedWalletProvider' import { useEnhancedWallet } from '@components/wallet/EnhancedWalletProvider'
import SwapSettings from './SwapSettings' import SwapSettings from './SwapSettings'
import InlineNotification from '@components/shared/InlineNotification'
const MAX_DIGITS = 11 const MAX_DIGITS = 11
export const withValueLimit = (values: NumberFormatValues): boolean => { export const withValueLimit = (values: NumberFormatValues): boolean => {
@ -59,7 +60,8 @@ const set = mangoStore.getState().set
const SwapForm = () => { const SwapForm = () => {
const { t } = useTranslation(['common', 'swap', 'trade']) const { t } = useTranslation(['common', 'swap', 'trade'])
const [selectedRoute, setSelectedRoute] = useState<RouteInfo>() //initial state is undefined null is returned on error
const [selectedRoute, setSelectedRoute] = useState<RouteInfo | null>()
const [animateSwitchArrow, setAnimateSwitchArrow] = useState(0) const [animateSwitchArrow, setAnimateSwitchArrow] = useState(0)
const [showTokenSelect, setShowTokenSelect] = useState('') const [showTokenSelect, setShowTokenSelect] = useState('')
const [showSettings, setShowSettings] = useState(false) const [showSettings, setShowSettings] = useState(false)
@ -132,16 +134,16 @@ const SwapForm = () => {
depending on the swapMode and set those values in state depending on the swapMode and set those values in state
*/ */
useEffect(() => { useEffect(() => {
if (bestRoute) { if (typeof bestRoute !== 'undefined') {
setSelectedRoute(bestRoute) setSelectedRoute(bestRoute)
if (inputBank && swapMode === 'ExactOut') { if (inputBank && swapMode === 'ExactOut' && bestRoute) {
const inAmount = new Decimal(bestRoute.inAmount) const inAmount = new Decimal(bestRoute!.inAmount)
.div(10 ** inputBank.mintDecimals) .div(10 ** inputBank.mintDecimals)
.toString() .toString()
setAmountInFormValue(inAmount) setAmountInFormValue(inAmount)
} else if (outputBank && swapMode === 'ExactIn') { } else if (outputBank && swapMode === 'ExactIn' && bestRoute) {
const outAmount = new Decimal(bestRoute.outAmount) const outAmount = new Decimal(bestRoute!.outAmount)
.div(10 ** outputBank.mintDecimals) .div(10 ** outputBank.mintDecimals)
.toString() .toString()
setAmountOutFormValue(outAmount) setAmountOutFormValue(outAmount)
@ -263,7 +265,7 @@ const SwapForm = () => {
return ( return (
!!(amountInAsDecimal.toNumber() || amountOutAsDecimal.toNumber()) && !!(amountInAsDecimal.toNumber() || amountOutAsDecimal.toNumber()) &&
connected && connected &&
!selectedRoute typeof selectedRoute === 'undefined'
) )
}, [amountInAsDecimal, amountOutAsDecimal, connected, selectedRoute]) }, [amountInAsDecimal, amountOutAsDecimal, connected, selectedRoute])
@ -490,7 +492,7 @@ const SwapFormSubmitButton = ({
amountOut: number | undefined amountOut: number | undefined
inputSymbol: string | undefined inputSymbol: string | undefined
loadingSwapDetails: boolean loadingSwapDetails: boolean
selectedRoute: RouteInfo | undefined selectedRoute: RouteInfo | undefined | null
setShowConfirm: (x: boolean) => void setShowConfirm: (x: boolean) => void
useMargin: boolean useMargin: boolean
}) => { }) => {
@ -513,31 +515,38 @@ const SwapFormSubmitButton = ({
const onClick = connected ? () => setShowConfirm(true) : handleConnect const onClick = connected ? () => setShowConfirm(true) : handleConnect
return ( return (
<Button <>
onClick={onClick} <Button
className="mt-6 mb-4 flex w-full items-center justify-center text-base" onClick={onClick}
disabled={disabled} className="mt-6 mb-4 flex w-full items-center justify-center text-base"
size="large" disabled={disabled}
> size="large"
{connected ? ( >
showInsufficientBalance ? ( {connected ? (
<div className="flex items-center"> showInsufficientBalance ? (
<ExclamationCircleIcon className="mr-2 h-5 w-5 flex-shrink-0" /> <div className="flex items-center">
{t('swap:insufficient-balance', { <ExclamationCircleIcon className="mr-2 h-5 w-5 flex-shrink-0" />
symbol: inputSymbol, {t('swap:insufficient-balance', {
})} symbol: inputSymbol,
</div> })}
) : loadingSwapDetails ? ( </div>
<Loading /> ) : loadingSwapDetails ? (
<Loading />
) : (
<span>{t('swap:review-swap')}</span>
)
) : ( ) : (
<span>{t('swap:review-swap')}</span> <div className="flex items-center">
) <LinkIcon className="mr-2 h-5 w-5" />
) : ( {t('connect')}
<div className="flex items-center"> </div>
<LinkIcon className="mr-2 h-5 w-5" /> )}
{t('connect')} </Button>
{selectedRoute === null && (
<div className="mb-4">
<InlineNotification type="error" desc={t('swap:no-swap-found')} />
</div> </div>
)} )}
</Button> </>
) )
} }

View File

@ -49,8 +49,8 @@ type JupiterRouteInfoProps = {
amountIn: Decimal amountIn: Decimal
onClose: () => void onClose: () => void
routes: RouteInfo[] | undefined routes: RouteInfo[] | undefined
selectedRoute: RouteInfo | undefined selectedRoute: RouteInfo | undefined | null
setSelectedRoute: Dispatch<SetStateAction<RouteInfo | undefined>> setSelectedRoute: Dispatch<SetStateAction<RouteInfo | undefined | null>>
slippage: number slippage: number
} }

View File

@ -112,43 +112,49 @@ const handleGetRoutes = async (
feeBps = 0, feeBps = 0,
wallet: string | undefined | null wallet: string | undefined | null
) => { ) => {
wallet ||= PublicKey.default.toBase58() try {
wallet ||= PublicKey.default.toBase58()
const results = await Promise.allSettled([ const results = await Promise.allSettled([
fetchMangoRoutes( fetchMangoRoutes(
inputMint, inputMint,
outputMint, outputMint,
amount, amount,
slippage, slippage,
swapMode, swapMode,
feeBps, feeBps,
wallet wallet
), ),
fetchJupiterRoutes( fetchJupiterRoutes(
inputMint, inputMint,
outputMint, outputMint,
amount, amount,
slippage, slippage,
swapMode, swapMode,
feeBps feeBps
), ),
]) ])
const responses = results const responses = results
.filter((x) => x.status === 'fulfilled' && x.value.bestRoute !== null) .filter((x) => x.status === 'fulfilled' && x.value.bestRoute !== null)
.map((x) => (x as any).value) .map((x) => (x as any).value)
const sortedByBiggestOutAmount = ( const sortedByBiggestOutAmount = (
responses as { responses as {
routes: RouteInfo[] routes: RouteInfo[]
bestRoute: RouteInfo bestRoute: RouteInfo
}[] }[]
).sort( ).sort(
(a, b) => Number(b.bestRoute.outAmount) - Number(a.bestRoute.outAmount) (a, b) => Number(b.bestRoute.outAmount) - Number(a.bestRoute.outAmount)
) )
return {
return { routes: sortedByBiggestOutAmount[0].routes,
routes: sortedByBiggestOutAmount[0].routes, bestRoute: sortedByBiggestOutAmount[0].bestRoute,
bestRoute: sortedByBiggestOutAmount[0].bestRoute, }
} catch (e) {
return {
routes: [],
bestRoute: null,
}
} }
} }
@ -172,7 +178,10 @@ const useQuoteRoutes = ({
? new Decimal(amount).mul(10 ** decimals) ? new Decimal(amount).mul(10 ** decimals)
: new Decimal(0) : new Decimal(0)
const res = useQuery<{ routes: RouteInfo[]; bestRoute: RouteInfo }, Error>( const res = useQuery<
{ routes: RouteInfo[]; bestRoute: RouteInfo | null },
Error
>(
['swap-routes', inputMint, outputMint, amount, slippage, swapMode, wallet], ['swap-routes', inputMint, outputMint, amount, slippage, swapMode, wallet],
async () => async () =>
handleGetRoutes( handleGetRoutes(

View File

@ -21,7 +21,11 @@ const MarketSelectDropdown = () => {
const [spotBaseFilter, setSpotBaseFilter] = useState('All') const [spotBaseFilter, setSpotBaseFilter] = useState('All')
const perpMarkets = useMemo(() => { const perpMarkets = useMemo(() => {
return allPerpMarkets.filter((p) => p.name !== 'MNGO-PERP') return allPerpMarkets.filter(
(p) =>
p.publicKey.toString() !==
'9Y8paZ5wUpzLFfQuHz8j2RtPrKsDtHx9sbgFmWb5abCw'
)
}, [allPerpMarkets]) }, [allPerpMarkets])
const spotBaseTokens: string[] = useMemo(() => { const spotBaseTokens: string[] = useMemo(() => {
@ -118,38 +122,36 @@ const MarketSelectDropdown = () => {
) : null} ) : null}
{activeTab === 'perp' {activeTab === 'perp'
? perpMarkets?.length ? perpMarkets?.length
? perpMarkets ? perpMarkets.map((m) => {
.filter((m) => m.name !== 'MNGO-PERP' || isTesting) return (
.map((m) => { <div
return ( className="flex items-center justify-between py-2 px-4"
<div key={m.publicKey.toString()}
className="flex items-center justify-between py-2 px-4" >
key={m.publicKey.toString()} <Link
href={{
pathname: '/trade',
query: { name: m.name },
}}
shallow={true}
> >
<Link <div className="default-transition flex items-center hover:cursor-pointer hover:bg-th-bkg-2">
href={{ <MarketLogos market={m} />
pathname: '/trade', <span
query: { name: m.name }, className={
}} m.name === selectedMarket?.name
shallow={true} ? 'text-th-active'
> : ''
<div className="default-transition flex items-center hover:cursor-pointer hover:bg-th-bkg-2"> }
<MarketLogos market={m} /> >
<span {m.name}
className={ </span>
m.name === selectedMarket?.name </div>
? 'text-th-active' </Link>
: '' <FavoriteMarketButton market={m} />
} </div>
> )
{m.name} })
</span>
</div>
</Link>
<FavoriteMarketButton market={m} />
</div>
)
})
: null : null
: null} : null}
</Popover.Panel> </Popover.Panel>

View File

@ -28,7 +28,7 @@ import { ArrowPathIcon } from '@heroicons/react/20/solid'
import { sleep } from 'utils' import { sleep } from 'utils'
export const decodeBookL2 = (book: SpotOrderBook | BookSide): number[][] => { export const decodeBookL2 = (book: SpotOrderBook | BookSide): number[][] => {
const depth = 40 const depth = 300
if (book instanceof SpotOrderBook) { if (book instanceof SpotOrderBook) {
return book.getL2(depth).map(([price, size]) => [price, size]) return book.getL2(depth).map(([price, size]) => [price, size])
} else if (book instanceof BookSide) { } else if (book instanceof BookSide) {
@ -473,11 +473,7 @@ const Orderbook = () => {
</div> </div>
{market ? ( {market ? (
<div id="trade-step-four"> <div id="trade-step-four">
<Tooltip <Tooltip content={t('trade:grouping')} placement="left" delay={250}>
content={t('trade:grouping')}
placement="bottom"
delay={250}
>
<GroupSize <GroupSize
tickSize={market.tickSize} tickSize={market.tickSize}
onChange={onGroupSizeChange} onChange={onGroupSizeChange}

View File

@ -26,5 +26,6 @@
"tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed", "tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed",
"use-margin": "Allow Margin" "use-margin": "Allow Margin",
"no-swap-found": "No swap found"
} }

View File

@ -26,5 +26,6 @@
"tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed", "tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed",
"use-margin": "Allow Margin" "use-margin": "Allow Margin",
"no-swap-found": "No swap found"
} }

View File

@ -26,5 +26,6 @@
"tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed", "tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed",
"use-margin": "Allow Margin" "use-margin": "Allow Margin",
"no-swap-found": "No swap found"
} }

View File

@ -26,5 +26,6 @@
"tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed", "tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed",
"use-margin": "Allow Margin" "use-margin": "Allow Margin",
"no-swap-found": "No swap found"
} }

View File

@ -26,5 +26,6 @@
"tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-balance": "You'll use your {{balance}} {{token}} balance and borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%", "tooltip-borrow-no-balance": "You'll borrow {{borrowAmount}} {{token}} to execute this swap. The current {{token}} variable borrow rate is {{rate}}%",
"tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed", "tooltip-max-slippage": "If price slips beyond your maximum slippage your swap will not be executed",
"use-margin": "Allow Margin" "use-margin": "Allow Margin",
"no-swap-found": "No swap found"
} }

View File

@ -48,7 +48,7 @@ import {
import spotBalancesUpdater from './spotBalancesUpdater' import spotBalancesUpdater from './spotBalancesUpdater'
import { PerpMarket } from '@blockworks-foundation/mango-v4/' import { PerpMarket } from '@blockworks-foundation/mango-v4/'
import perpPositionsUpdater from './perpPositionsUpdater' import perpPositionsUpdater from './perpPositionsUpdater'
import { PRIORITY_FEES } from '@components/settings/RpcSettings' import { DEFAULT_PRIORITY_FEE } from '@components/settings/RpcSettings'
const GROUP = new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX') const GROUP = new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX')
@ -78,10 +78,9 @@ const emptyWallet = new EmptyWallet(Keypair.generate())
const initMangoClient = ( const initMangoClient = (
provider: AnchorProvider, provider: AnchorProvider,
opts = { prioritizationFee: PRIORITY_FEES[2].value } opts = { prioritizationFee: DEFAULT_PRIORITY_FEE.value }
): MangoClient => { ): MangoClient => {
return MangoClient.connect(provider, CLUSTER, MANGO_V4_ID[CLUSTER], { return MangoClient.connect(provider, CLUSTER, MANGO_V4_ID[CLUSTER], {
// blockhashCommitment: 'confirmed',
prioritizationFee: opts.prioritizationFee, prioritizationFee: opts.prioritizationFee,
idsSource: 'get-program-accounts', idsSource: 'get-program-accounts',
postSendTxCallback: ({ txid }: { txid: string }) => { postSendTxCallback: ({ txid }: { txid: string }) => {
@ -660,6 +659,12 @@ const mangoStore = create<MangoStore>()(
const { value: reloadedMangoAccount, slot } = const { value: reloadedMangoAccount, slot } =
await mangoAccount.reloadWithSlot(client) await mangoAccount.reloadWithSlot(client)
if (slot > lastSlot) { if (slot > lastSlot) {
const ma = get().mangoAccounts.find((ma) =>
ma.publicKey.equals(reloadedMangoAccount.publicKey)
)
if (ma) {
Object.assign(ma, reloadedMangoAccount)
}
set((state) => { set((state) => {
state.mangoAccount.current = reloadedMangoAccount state.mangoAccount.current = reloadedMangoAccount
state.mangoAccount.lastSlot = slot state.mangoAccount.lastSlot = slot
@ -941,7 +946,8 @@ const mangoStore = create<MangoStore>()(
) )
provider.opts.skipPreflight = true provider.opts.skipPreflight = true
const prioritizationFee = Number( const prioritizationFee = Number(
localStorage.getItem(PRIORITY_FEE_KEY) localStorage.getItem(PRIORITY_FEE_KEY) ??
DEFAULT_PRIORITY_FEE.value
) )
const client = initMangoClient(provider, { prioritizationFee }) const client = initMangoClient(provider, { prioritizationFee })

View File

@ -10,7 +10,7 @@ export const OUTPUT_TOKEN_DEFAULT = 'SOL'
export const JUPITER_V4_PROGRAM_ID = export const JUPITER_V4_PROGRAM_ID =
'JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB' 'JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB'
export const ALPHA_DEPOSIT_LIMIT = 1000 export const ALPHA_DEPOSIT_LIMIT = 200
export const CONNECTION_COMMITMENT = 'processed' export const CONNECTION_COMMITMENT = 'processed'

103
yarn.lock
View File

@ -15,16 +15,23 @@
core-js-pure "^3.20.2" core-js-pure "^3.20.2"
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.6.2": "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.14.5", "@babel/runtime@^7.17.9", "@babel/runtime@^7.18.6", "@babel/runtime@^7.18.9", "@babel/runtime@^7.6.2":
version "7.20.7" version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd"
integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
dependencies: dependencies:
regenerator-runtime "^0.13.11" regenerator-runtime "^0.13.11"
"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2":
version "7.20.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
dependencies:
regenerator-runtime "^0.13.11"
"@blockworks-foundation/mango-v4@https://github.com/blockworks-foundation/mango-v4.git#ts-client": "@blockworks-foundation/mango-v4@https://github.com/blockworks-foundation/mango-v4.git#ts-client":
version "0.0.1-beta.6" version "0.0.1-beta.6"
resolved "https://github.com/blockworks-foundation/mango-v4.git#1ca560c007081127ac31486a96a3729da22f99fb" resolved "https://github.com/blockworks-foundation/mango-v4.git#2f754115d06745282b863e7a905bdb25bf85d309"
dependencies: dependencies:
"@project-serum/anchor" "^0.25.0" "@project-serum/anchor" "^0.25.0"
"@project-serum/serum" "^0.13.65" "@project-serum/serum" "^0.13.65"
@ -374,9 +381,9 @@
integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw== integrity sha512-Rk4SkJFaXZiznFyC/t77Q0NKS4FL7TLJJsVG2V2oiEq3kJVeTdxysEe/yRWSpnWMe808XRDJ+VFh5pt/FN5plw==
"@noble/hashes@^1.1.2": "@noble/hashes@^1.1.2":
version "1.1.5" version "1.2.0"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.5.tgz#1a0377f3b9020efe2fae03290bd2a12140c95c11" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12"
integrity sha512-LTMZiiLc+V4v1Yi16TD6aX2gmtKszNye0pQgbaLqkvhIqP7nVsSaJsWloGQjJfJ8offaoP5GtX3yY5swbcJxxQ== integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==
"@noble/secp256k1@^1.6.3": "@noble/secp256k1@^1.6.3":
version "1.7.1" version "1.7.1"
@ -1091,7 +1098,29 @@
"@wallet-standard/app" "^1.0.0" "@wallet-standard/app" "^1.0.0"
"@wallet-standard/base" "^1.0.0" "@wallet-standard/base" "^1.0.0"
"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.31.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.44.3", "@solana/web3.js@^1.63.1": "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.63.1":
version "1.73.2"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.2.tgz#4b30cd402b35733dae3a7d0b638be26a7742b395"
integrity sha512-9WACF8W4Nstj7xiDw3Oom22QmrhBh0VyZyZ7JvvG3gOxLWLlX3hvm5nPVJOGcCE/9fFavBbCUb5A6CIuvMGdoA==
dependencies:
"@babel/runtime" "^7.12.5"
"@noble/ed25519" "^1.7.0"
"@noble/hashes" "^1.1.2"
"@noble/secp256k1" "^1.6.3"
"@solana/buffer-layout" "^4.0.0"
agentkeepalive "^4.2.1"
bigint-buffer "^1.1.5"
bn.js "^5.0.0"
borsh "^0.7.0"
bs58 "^4.0.1"
buffer "6.0.1"
fast-stable-stringify "^1.0.0"
jayson "^3.4.4"
node-fetch "2"
rpc-websockets "^7.5.0"
superstruct "^0.14.2"
"@solana/web3.js@^1.31.0", "@solana/web3.js@^1.44.3":
version "1.73.0" version "1.73.0"
resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.0.tgz#c65f9f954ac80fca6952765c931dd72e57e1b572" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.73.0.tgz#c65f9f954ac80fca6952765c931dd72e57e1b572"
integrity sha512-YrgX3Py7ylh8NYkbanoINUPCj//bWUjYZ5/WPy9nQ9SK3Cl7QWCR+NmbDjmC/fTspZGR+VO9LTQslM++jr5PRw== integrity sha512-YrgX3Py7ylh8NYkbanoINUPCj//bWUjYZ5/WPy9nQ9SK3Cl7QWCR+NmbDjmC/fTspZGR+VO9LTQslM++jr5PRw==
@ -2226,12 +2255,13 @@ axios@^0.21.0, axios@^0.21.4:
dependencies: dependencies:
follow-redirects "^1.14.0" follow-redirects "^1.14.0"
axios@^0.25.0: axios@^0.27.2:
version "0.25.0" version "0.27.2"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
dependencies: dependencies:
follow-redirects "^1.14.7" follow-redirects "^1.14.9"
form-data "^4.0.0"
axobject-query@^2.2.0: axobject-query@^2.2.0:
version "2.2.0" version "2.2.0"
@ -2784,9 +2814,9 @@ crc@^3.8.0:
buffer "^5.1.0" buffer "^5.1.0"
crc@^4.1.0: crc@^4.1.0:
version "4.2.0" version "4.3.2"
resolved "https://registry.yarnpkg.com/crc/-/crc-4.2.0.tgz#3017c95b2c5f18e9907e80540e1d0a4ea0c00109" resolved "https://registry.yarnpkg.com/crc/-/crc-4.3.2.tgz#49b7821cbf2cf61dfd079ed93863bbebd5469b9a"
integrity sha512-TpRSRyMXRyVu2LYKgu0uxuYvk026DS7BKAk8hdrJ0deOUxArnUTgsFvbPkQc2i3qHoT0upKPBJ+WoKc6t8kCMg== integrity sha512-uGDHf4KLLh2zsHa8D8hIQ1H/HtFQhyHrc0uhHBcoKGol/Xnb+MPYfUMw7cvON6ze/GUESTudKayDcJC5HnJv1A==
create-ecdh@^4.0.0: create-ecdh@^4.0.0:
version "4.0.4" version "4.0.4"
@ -3840,7 +3870,7 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
follow-redirects@^1.14.0, follow-redirects@^1.14.7, follow-redirects@^1.15.0: follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0:
version "1.15.2" version "1.15.2"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
@ -4553,7 +4583,7 @@ jmespath@^0.15.0:
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
integrity sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w== integrity sha512-+kHj8HXArPfpPEKGLZ+kB5ONRTCiGQXo8RQYL0hH8t6pWXUBBK5KkkQmTNOwKK4LEsd0yTsgtjJVm4UBSZea4w==
joi@^17.6.0: joi@^17.7.0:
version "17.7.0" version "17.7.0"
resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3"
integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg==
@ -4902,7 +4932,7 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies: dependencies:
brace-expansion "^1.1.7" brace-expansion "^1.1.7"
minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.7:
version "1.2.7" version "1.2.7"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
@ -5037,9 +5067,9 @@ node-addon-api@^2.0.0:
integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
node-fetch@2, node-fetch@^2.6.1: node-fetch@2, node-fetch@^2.6.1:
version "2.6.8" version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.8.tgz#a68d30b162bc1d8fd71a367e81b997e1f4d4937e" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
integrity sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg== integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
dependencies: dependencies:
whatwg-url "^5.0.0" whatwg-url "^5.0.0"
@ -6058,7 +6088,7 @@ rxjs@6, rxjs@^6.6.3:
dependencies: dependencies:
tslib "^1.9.0" tslib "^1.9.0"
rxjs@^7.5.4: rxjs@^7.8.0:
version "7.8.0" version "7.8.0"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
@ -6285,9 +6315,9 @@ sshpk@^1.7.0:
tweetnacl "~0.14.0" tweetnacl "~0.14.0"
start-server-and-test@^1.14.0: start-server-and-test@^1.14.0:
version "1.15.2" version "1.15.3"
resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.15.2.tgz#3c4f9b358a0dc5ae03a96dd7d7ae9e25a3b24165" resolved "https://registry.yarnpkg.com/start-server-and-test/-/start-server-and-test-1.15.3.tgz#33bb6465ff4d5e3a476337512a7e0d737a5ef026"
integrity sha512-t5xJX04Hg7hqxiKHMJBz/n4zIMsE6G7hpAcerFAH+4Vh9le/LeyFcJERJM7WLiPygWF9TOg33oroJF1XOzJtYQ== integrity sha512-4GqkqghvUR9cJ8buvtgkyT0AHgVwCJ5EN8eDEhe9grTChGwWUxGm2nqfSeE9+0PZkLRdFqcwTwxVHe1y3ViutQ==
dependencies: dependencies:
arg "^5.0.2" arg "^5.0.2"
bluebird "3.7.2" bluebird "3.7.2"
@ -6296,7 +6326,7 @@ start-server-and-test@^1.14.0:
execa "5.1.1" execa "5.1.1"
lazy-ass "1.6.0" lazy-ass "1.6.0"
ps-tree "1.2.0" ps-tree "1.2.0"
wait-on "6.0.1" wait-on "7.0.1"
stream-browserify@^3.0.0: stream-browserify@^3.0.0:
version "3.0.0" version "3.0.0"
@ -6594,7 +6624,12 @@ tslib@^1.8.1, tslib@^1.9.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0: tslib@^2.0.3, tslib@^2.1.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0:
version "2.4.1" version "2.4.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e"
integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==
@ -7079,16 +7114,16 @@ void-elements@3.1.0:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09"
integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==
wait-on@6.0.1: wait-on@7.0.1:
version "6.0.1" version "7.0.1"
resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9"
integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==
dependencies: dependencies:
axios "^0.25.0" axios "^0.27.2"
joi "^17.6.0" joi "^17.7.0"
lodash "^4.17.21" lodash "^4.17.21"
minimist "^1.2.5" minimist "^1.2.7"
rxjs "^7.5.4" rxjs "^7.8.0"
walktour@5.1.1: walktour@5.1.1:
version "5.1.1" version "5.1.1"