From 91c468aee91c971d9762fce0a4de98c5210d98b6 Mon Sep 17 00:00:00 2001 From: vuonghuuhung Date: Fri, 26 Jul 2024 00:29:05 +0700 Subject: [PATCH] add price range template --- .eslintignore | 1 + babel.config.js | 3 +- package.json | 3 + src/assets/images/continuous.svg | 10 + src/assets/images/discrete.svg | 10 + src/assets/images/zoom-in-icon.svg | 5 + src/assets/images/zoom-out-icon.svg | 5 + .../CreatePosition/index.module.scss | 150 +++ .../components/CreatePosition/index.tsx | 208 ++- .../components/PriceRangePlot/Brush/Brush.tsx | 261 ++++ .../PriceRangePlot/Brush/index.module.scss | 6 + .../PriceRangePlot/Brush/svgHandles.tsx | 113 ++ .../PriceRangePlot/PriceRangePlot.tsx | 441 +++++++ .../PriceRangePlot/index.module.scss | 15 + .../components/PriceRangePlot/utils.ts | 182 +++ .../Pool-V3/packages/sdk/OraiswapV3.client.ts | 888 +++++++++++++ .../Pool-V3/packages/sdk/OraiswapV3.types.ts | 238 ++++ src/pages/Pool-V3/packages/sdk/index.ts | 2 + .../packages/wasm/oraiswap_v3_wasm.d.ts | 646 ++++++++++ .../Pool-V3/packages/wasm/oraiswap_v3_wasm.js | 1145 +++++++++++++++++ .../packages/wasm/oraiswap_v3_wasm_bg.wasm | Bin 0 -> 224361 bytes .../wasm/oraiswap_v3_wasm_bg.wasm.d.ts | 71 + src/pages/Pool-V3/packages/wasm/package.json | 24 + yarn.lock | 759 ++++++++++- 24 files changed, 5155 insertions(+), 31 deletions(-) create mode 100644 src/assets/images/continuous.svg create mode 100644 src/assets/images/discrete.svg create mode 100644 src/assets/images/zoom-in-icon.svg create mode 100644 src/assets/images/zoom-out-icon.svg create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/Brush/Brush.tsx create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/Brush/index.module.scss create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/Brush/svgHandles.tsx create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/PriceRangePlot.tsx create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/index.module.scss create mode 100644 src/pages/Pool-V3/components/PriceRangePlot/utils.ts create mode 100644 src/pages/Pool-V3/packages/sdk/OraiswapV3.client.ts create mode 100644 src/pages/Pool-V3/packages/sdk/OraiswapV3.types.ts create mode 100644 src/pages/Pool-V3/packages/sdk/index.ts create mode 100644 src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.d.ts create mode 100644 src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js create mode 100644 src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm create mode 100644 src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm.d.ts create mode 100644 src/pages/Pool-V3/packages/wasm/package.json diff --git a/.eslintignore b/.eslintignore index d4374fd55..fee088922 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,3 +3,4 @@ public/vendor/* src/libs/* +pages/Pool-V3/packages/* diff --git a/babel.config.js b/babel.config.js index 4ffcc4de9..7f3d0b3ec 100644 --- a/babel.config.js +++ b/babel.config.js @@ -6,7 +6,8 @@ module.exports = function (api) { '@oraichain/operator-overloading', { classNames: ['BigDecimal'] - } + }, + "@babel/plugin-proposal-import-wasm-source" ] ] }; diff --git a/package.json b/package.json index bf594ae6f..07cf374ef 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "author": "Oraichain Labs", "license": "Apache-2.0", "dependencies": { + "@babel/plugin-proposal-import-wasm-source": "^7.24.7", "@cosmjs/cosmwasm-stargate": "^0.31.0", "@cosmjs/proto-signing": "^0.31.0", "@cosmjs/stargate": "^0.31.0", @@ -14,6 +15,8 @@ "@injectivelabs/sdk-ts": "1.12.1", "@leapwallet/cosmos-snap-provider": "0.1.25", "@lucky-canvas/react": "^0.1.13", + "@nivo/bar": "^0.87.0", + "@nivo/line": "^0.86.0", "@oraichain/common-contracts-sdk": "^1.0.31", "@oraichain/ethereum-multicall": "^1.0.2", "@oraichain/kawaiiverse-txs": "^0.0.3", diff --git a/src/assets/images/continuous.svg b/src/assets/images/continuous.svg new file mode 100644 index 000000000..b2964f59d --- /dev/null +++ b/src/assets/images/continuous.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/discrete.svg b/src/assets/images/discrete.svg new file mode 100644 index 000000000..be52d84d2 --- /dev/null +++ b/src/assets/images/discrete.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/assets/images/zoom-in-icon.svg b/src/assets/images/zoom-in-icon.svg new file mode 100644 index 000000000..c97966cb2 --- /dev/null +++ b/src/assets/images/zoom-in-icon.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/assets/images/zoom-out-icon.svg b/src/assets/images/zoom-out-icon.svg new file mode 100644 index 000000000..f423aa5a8 --- /dev/null +++ b/src/assets/images/zoom-out-icon.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/src/pages/Pool-V3/components/CreatePosition/index.module.scss b/src/pages/Pool-V3/components/CreatePosition/index.module.scss index 212d2e3b9..6a5c9d8f2 100644 --- a/src/pages/Pool-V3/components/CreatePosition/index.module.scss +++ b/src/pages/Pool-V3/components/CreatePosition/index.module.scss @@ -60,6 +60,156 @@ .item { flex: 1; + + .wrapper { + width: 100%; + display: flex; + margin-bottom: 48px; + + .itemTitleWrapper { + width: 70%; + + .itemTitle { + color: var(--Colors-Neutral-Text-text-token-name, #f7f7f7); + font-weight: 600; + font-size: 16px; + } + + .liquidityActive { + color: #979995; + font-size: 12px; + font-weight: 400; + line-height: 18px; + + .activeLiquidityIcon { + display: inline-block; + height: 14px; + width: 14px; + border: 2px solid; + border-color: #979995; + color: #979995; + border-radius: 50%; + font-size: 8px; + line-height: 10px; + font-weight: bolder; + text-align: center; + box-sizing: border-box; + cursor: default; + } + } + } + + .itemSwitcherWrapper { + width: 30%; + display: flex; + flex-direction: row-reverse; + + .switcherContainer { + overflow: visible; + height: 33px; + border-radius: 14px; + display: flex; + justify-content: space-evenly; + width: 90px; + align-items: end; + background-color: #232521; + + .singleTabClasses { + z-index: 1; + display: flex; + justify-content: center; + align-items: center; + + .continuous { + display: block; + } + + .discrete { + display: block; + } + } + } + } + } + + .itemChartAndPriceWrapper { + gap: 12px; + display: flex; + flex-direction: column; + + .currentPriceWrapper { + border-radius: 8px; + padding: 12px; + display: flex; + background-color: #232521; + align-items: center; + justify-content: space-between; + + .currentPriceTitle { + color: var(--Colors-Neutral-Text-text-token-name, #979995); + font-size: 13px; + font-weight: 400; + line-height: 18px; + } + + .currentPriceValue { + color: var(--Colors-Neutral-Text-text-token-name, #f7f7f7); + text-align: end; + font-size: 18px; + font-weight: 600; + line-height: 30px; + + .pair { + color: var(--Colors-Neutral-Text-text-token-name, #979995); + font-size: 12px; + font-weight: 400; + line-height: 18px; + } + } + } + + .minMaxPriceWrapper { + display: flex; + gap: 12px; + align-items: center; + justify-content: space-between; + width: 100%; + + .minMaxPrice { + border-radius: 8px; + display: flex; + gap: 12px; + align-items: center; + justify-content: space-between; + background-color: #232521; + width: 100%; + padding: 12px; + + .minMaxPriceTitle { + color: var(--Colors-Neutral-Text-text-token-name, #979995); + font-size: 13px; + text-align: end; + font-weight: 400; + line-height: 18px; + } + + .minMaxPriceValue { + color: var(--Colors-Neutral-Text-text-token-name, #f7f7f7); + font-size: 18px; + text-align: end; + font-weight: 600; + line-height: 30px; + + .pair { + color: var(--Colors-Neutral-Text-text-token-name, #979995); + font-size: 12px; + font-weight: 400; + line-height: 18px; + } + } + } + } + } } @include mobile { diff --git a/src/pages/Pool-V3/components/CreatePosition/index.tsx b/src/pages/Pool-V3/components/CreatePosition/index.tsx index 6533a8efc..d7d16cca9 100644 --- a/src/pages/Pool-V3/components/CreatePosition/index.tsx +++ b/src/pages/Pool-V3/components/CreatePosition/index.tsx @@ -1,14 +1,132 @@ import classNames from 'classnames'; import { ReactComponent as BackIcon } from 'assets/icons/back.svg'; import { ReactComponent as SettingIcon } from 'assets/icons/setting.svg'; +import { ReactComponent as Continuous } from 'assets/images/continuous.svg'; +import { ReactComponent as Discrete } from 'assets/images/discrete.svg'; import styles from './index.module.scss'; import { useNavigate } from 'react-router-dom'; import useTheme from 'hooks/useTheme'; +import PriceRangePlot from '../PriceRangePlot/PriceRangePlot'; +import { useEffect, useState } from 'react'; +import { calcPrice, calcTicksAmountInRange, spacingMultiplicityGte } from '../PriceRangePlot/utils'; +// import { getMinTick } from 'pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js'; + +const args = { + currentPrice: 10000, + data: [ + { + index: 1, + x: 1, + y: 1 + } + ], + initialIsDiscreteValue: false, + leftRange: { + index: 2, + x: 10000 + }, + rightRange: { + index: 2, + x: 10000 + }, + max: 100, + min: 0, + midPrice: { + x: 1, + index: 1 + }, + onDiscreteChange: () => {}, + reloadHandler: () => {}, + ticksLoading: false, + tickSpacing: 1, + tokenX: { + name: 'BTC', + decimal: 9 + }, + tokenY: { + name: 'ETH', + decimal: 12 + }, + xToY: true, + hasTicksError: false +}; const CreatePosition = () => { const navigate = useNavigate(); const theme = useTheme(); + const [plotMin, setPlotMin] = useState(0); + const [plotMax, setPlotMax] = useState(1); + + const [isPlotDiscrete, setIsPlotDiscrete] = useState(false); + + const currentPrice = 10000; + const leftRange = { + index: 2, + x: 10000 + }; + const rightRange = { + index: 2, + x: 10000 + }; + const midPrice = { + index: 2, + x: 1020 + }; + const tokenX = { + name: 'BTC', + decimal: 9 + }; + const tokenY = { + name: 'ETH', + decimal: 12 + }; + + useEffect(() => { + // const initSideDist = Math.abs( + // leftRange.x - + // calcPrice( + // Math.max( + // spacingMultiplicityGte(Number(getMinTick(Number(args.tickSpacing))), Number(args.tickSpacing)), + // Number(leftRange.index) - Number(args.tickSpacing) * 15 + // ), + // args.xToY, + // tokenX.decimal, + // tokenY.decimal + // ) + // ); + // setPlotMin(leftRange.x - initSideDist); + // setPlotMax(rightRange.x + initSideDist); + }, [args.ticksLoading, leftRange, rightRange]); + + const zoomMinus = () => { + const diff = plotMax - plotMin; + const newMin = plotMin - diff / 4; + const newMax = plotMax + diff / 4; + setPlotMin(newMin); + setPlotMax(newMax); + }; + + const zoomPlus = () => { + const diff = plotMax - plotMin; + const newMin = plotMin + diff / 6; + const newMax = plotMax - diff / 6; + + if ( + calcTicksAmountInRange( + Math.max(newMin, 0), + newMax, + Number(args.tickSpacing), + args.xToY, + Number(tokenX.decimal), + Number(tokenY.decimal) + ) >= 4 + ) { + setPlotMin(newMin); + setPlotMax(newMax); + } + }; + return (
@@ -23,7 +141,95 @@ const CreatePosition = () => {
TOKEN section
-
PRICE section
+
+
+
+

Price Range

+

+ Active Liquidity i +

+
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+ Chart + {/* */} +
+ +
+
+

Current Price

+
+
+

+

0.081242

+

ORAI / USDT

+

+
+
+ +
+
+
+

Min Price

+
+
+

+

0.081242

+

ORAI / USDT

+

+
+
+ +
+
+

Max Price

+
+
+

+

0.081242

+

ORAI / USDT

+

+
+
+
+
+
diff --git a/src/pages/Pool-V3/components/PriceRangePlot/Brush/Brush.tsx b/src/pages/Pool-V3/components/PriceRangePlot/Brush/Brush.tsx new file mode 100644 index 000000000..b91b7594b --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/Brush/Brush.tsx @@ -0,0 +1,261 @@ +import { CustomLayerProps } from '@nivo/line' +import React, { useState, useEffect, useRef, PointerEventHandler, TouchEventHandler } from 'react' +import { MaxHandle, MinHandle } from './svgHandles' +import styles from './index.module.scss' + +export interface HandleProps { + plotWidth: number + height: number + position: number + minPosition: number + maxPosition: number + onDrop: (position: number) => void + isStart?: boolean + onStart: () => void + disabled?: boolean +} + +export const Handle: React.FC = ({ + plotWidth, + height, + position, + minPosition, + maxPosition, + onDrop, + isStart = false, + onStart, + disabled = false +}) => { + const [drag, setDrag] = useState(false) + const [currentPosition, setCurrentPosition] = useState(position) + const [offset, setOffset] = useState(0) + + const handleRef = useRef(null) + + useEffect(() => { + setCurrentPosition(position) + }, [position, drag]) + + const startDrag: PointerEventHandler = event => { + onStart() + setDrag(true) + if (handleRef.current) { + const CTM = handleRef.current.getScreenCTM() + + if (CTM) { + const ctmX = (event.clientX - CTM.e) / CTM.a + setOffset(ctmX - currentPosition) + } + } + } + + const startTouchDrag: TouchEventHandler = event => { + onStart() + setDrag(true) + if (handleRef.current) { + const CTM = handleRef.current.getScreenCTM() + + if (CTM) { + const ctmX = (event.targetTouches[0].clientX - CTM.e) / CTM.a + setOffset(ctmX - currentPosition) + } + } + } + + const endDrag = () => { + if (drag) { + setDrag(false) + onDrop(currentPosition) + } + } + + const dragHandler: PointerEventHandler = event => { + if (drag && handleRef.current) { + event.preventDefault() + event.stopPropagation() + const CTM = handleRef.current.getScreenCTM() + + if (CTM) { + const x = (event.clientX - CTM.e) / CTM.a - offset + + if (x >= minPosition && x <= maxPosition) { + setCurrentPosition(x) + } + } + } + } + + const dragTouchHandler: TouchEventHandler = event => { + if (drag && handleRef.current) { + event.preventDefault() + event.stopPropagation() + const CTM = handleRef.current.getScreenCTM() + + if (CTM) { + const x = (event.targetTouches[0].clientX - CTM.e) / CTM.a - offset + + if (x >= minPosition && x <= maxPosition) { + setCurrentPosition(x) + } + } + } + } + + const isReversed = () => (isStart ? currentPosition < 37 : plotWidth - currentPosition < 37) + + return ( + <> + {isStart ? ( + + ) : ( + + )} + + + ) +} + +export interface InnerBrushProps extends CustomLayerProps { + leftPosition?: number + rightPosition?: number + onLeftDrop: (position: number) => void + onRightDrop: (position: number) => void + plotMin: number + plotMax: number + disabled: boolean +} + +export const InnerBrush: React.FC = ({ + innerHeight, + innerWidth, + leftPosition, + rightPosition, + onLeftDrop, + onRightDrop, + plotMin, + plotMax, + disabled +}) => { + const unitLen = innerWidth / (plotMax - plotMin) + const [reverse, setReverse] = useState(false) + + const start = + typeof leftPosition !== 'undefined' && leftPosition >= plotMin && leftPosition <= plotMax ? ( + { + onLeftDrop(position / innerWidth) + if ((leftPosition - plotMin) * unitLen < 37) { + setReverse(false) + } + }} + isStart + onStart={() => { + setReverse(true) + }} + disabled={disabled} + /> + ) : null + + const end = + typeof rightPosition !== 'undefined' && rightPosition >= plotMin && rightPosition <= plotMax ? ( + { + onRightDrop(position / innerWidth) + if (innerWidth - (rightPosition - plotMin) * unitLen < 37) { + setReverse(true) + } + }} + onStart={() => { + setReverse(false) + }} + disabled={disabled} + /> + ) : null + + return ( + <> + {reverse ? end : start} + + {reverse ? start : end} + + ) +} + +export const Brush = + ( + leftPosition: number, + rightPosition: number, + onLeftDrop: (position: number) => void, + onRightDrop: (position: number) => void, + plotMin: number, + plotMax: number, + disabled: boolean = false + ): React.FC => + layerProps => ( + + ) + +export default Brush diff --git a/src/pages/Pool-V3/components/PriceRangePlot/Brush/index.module.scss b/src/pages/Pool-V3/components/PriceRangePlot/Brush/index.module.scss new file mode 100644 index 000000000..2b3d80d44 --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/Brush/index.module.scss @@ -0,0 +1,6 @@ +@import 'src/styles/themes'; +@import 'src/styles/mixins'; + +.handle { + cursor: ew-resize; +} \ No newline at end of file diff --git a/src/pages/Pool-V3/components/PriceRangePlot/Brush/svgHandles.tsx b/src/pages/Pool-V3/components/PriceRangePlot/Brush/svgHandles.tsx new file mode 100644 index 000000000..092641e3b --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/Brush/svgHandles.tsx @@ -0,0 +1,113 @@ +import React from 'react' + +export interface ISVGHandle { + height: number + className?: string + x: number + fill: string + textColor: string + isReversed?: boolean +} + +export const MaxText: React.FC> = ({ x, textColor }) => ( + + + +) + +export const MinText: React.FC> = ({ x, textColor }) => ( + + + +) + +export const LeftHandle: React.FC> = ({ height = 0, fill }) => ( + <> + + + + + +) + +export const RightHandle: React.FC> = ({ + height = 0, + fill +}) => ( + <> + + + + + +) + +export const MaxHandle: React.FC = ({ + height, + className, + x, + fill, + textColor, + isReversed = false +}) => ( + + {!isReversed ? ( + + ) : ( + + )} + + +) + +export const MinHandle: React.FC = ({ + height, + className, + x, + fill, + textColor, + isReversed = false +}) => ( + + {!isReversed ? ( + + ) : ( + + )} + + +) diff --git a/src/pages/Pool-V3/components/PriceRangePlot/PriceRangePlot.tsx b/src/pages/Pool-V3/components/PriceRangePlot/PriceRangePlot.tsx new file mode 100644 index 000000000..fd984e958 --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/PriceRangePlot.tsx @@ -0,0 +1,441 @@ +import React, { useCallback, useMemo, useRef } from 'react'; +import { Layer, ResponsiveLine } from '@nivo/line'; +import { linearGradientDef } from '@nivo/core'; +import classNames from 'classnames'; +import Brush from './Brush/Brush'; +import { nearestTickIndex } from './utils'; +import styles from './index.module.scss'; +import loadingGif from 'assets/gif/loading.gif'; +import { ReactComponent as ZoomInIcon } from 'assets/images/zoom-in-icon.svg'; +import { ReactComponent as ZoomOutIcon } from 'assets/images/zoom-out-icon.svg'; +// import { PlotTickData } from '@store/reducers/positions' +// import { nearestTickIndex } from '@store/consts/utils' + +export interface PlotTickData { + x: number; + y: number; + index: number; +} + +export type TickPlotPositionData = Omit; + +export interface IPriceRangePlot { + data: PlotTickData[]; + midPrice?: TickPlotPositionData; + leftRange: TickPlotPositionData; + rightRange: TickPlotPositionData; + onChangeRange?: (left: number, right: number) => void; + style?: React.CSSProperties; + className?: string; + disabled?: boolean; + plotMin: number; + plotMax: number; + zoomMinus: () => void; + zoomPlus: () => void; + loading?: boolean; + isXtoY: boolean; + xDecimal: number; + yDecimal: number; + tickSpacing: number; + isDiscrete?: boolean; + coverOnLoading?: boolean; + hasError?: boolean; + reloadHandler: () => void; +} + +export const PriceRangePlot: React.FC = ({ + data, + leftRange, + rightRange, + midPrice, + onChangeRange, + style, + className, + disabled = false, + plotMin, + plotMax, + zoomMinus, + zoomPlus, + loading, + isXtoY, + xDecimal, + yDecimal, + tickSpacing, + isDiscrete = false, + coverOnLoading = false, + hasError = false, + reloadHandler +}) => { + // const { classes } = useStyles(); + + // const isSmDown = useMediaQuery(theme.breakpoints.down('sm')) + + const containerRef = useRef(null); + + const maxVal = useMemo(() => Math.max(...data.map((element) => element.y)), [data]); + + const pointsOmitter = useCallback( + (data: Array<{ x: number; y: number }>) => { + if (containerRef.current === null || data.length <= 1000) { + return data; + } + + const minXDist = containerRef.current.offsetWidth / 100000; + const minYChange = containerRef.current.offsetHeight / 1000; + + const dataAfterOmit: Array<{ x: number; y: number }> = []; + + data.forEach((tick, index) => { + if ( + index === 0 || + index === data.length - 1 || + (dataAfterOmit.length > 0 && + ((tick.x - dataAfterOmit[dataAfterOmit.length - 1].x) / (plotMax - plotMin) >= minXDist || + Math.abs(tick.y - dataAfterOmit[dataAfterOmit.length - 1].y) / maxVal >= minYChange)) + ) { + dataAfterOmit.push(tick); + } + }); + + return dataAfterOmit; + }, + [containerRef.current, plotMin, plotMax, maxVal] + ); + + const currentLessThanRange = useMemo(() => { + if (!data.length || disabled || leftRange.x < Math.max(plotMin, data[0].x)) { + return []; + } + + let rangeData: Array<{ x: number; y: number }> = data.filter((tick) => tick.x <= leftRange.x); + const outData: Array<{ x: number; y: number }> = data.filter((tick) => tick.x < Math.max(plotMin, data[0].x)); + + if (!rangeData.length) { + return []; + } + + if (rangeData[rangeData.length - 1].x < leftRange.x) { + rangeData.push({ + x: leftRange.x, + y: rangeData[rangeData.length - 1].y + }); + } + + rangeData = rangeData.slice(outData.length, rangeData.length); + + if (rangeData[0].x > Math.max(plotMin, data[0].x)) { + rangeData.unshift({ + x: Math.max(plotMin, data[0].x), + y: outData.length > 0 ? outData[outData.length - 1].y : 0 + }); + } + + return pointsOmitter(rangeData); + }, [disabled, leftRange, data, plotMin, plotMax, pointsOmitter]); + + const currentRange = useMemo(() => { + if (!data.length) return; + if (disabled) { + const outMinData: Array<{ x: number; y: number }> = data.filter((tick) => tick.x < Math.max(plotMin, data[0].x)); + const outMaxData: Array<{ x: number; y: number }> = data.filter( + (tick) => tick.x > Math.min(plotMax, data[data.length - 1].x) + ); + const rangeData: Array<{ x: number; y: number }> = data.slice(outMinData.length, data.length - outMaxData.length); + + if (!rangeData.length || rangeData[0].x > Math.max(plotMin, data[0].x)) { + rangeData.unshift({ + x: Math.max(plotMin, data[0].x), + y: outMinData.length > 0 ? outMinData[outMinData.length - 1].y : 0 + }); + } + + if (rangeData[rangeData.length - 1].x < Math.min(plotMax, data[data.length - 1].x)) { + rangeData.push({ + x: Math.min(plotMax, data[data.length - 1].x), + y: rangeData[rangeData.length - 1].y + }); + } + + return pointsOmitter(rangeData); + } + + if (leftRange.x > plotMax || rightRange.x < plotMin) { + return []; + } + + const lessThan = data.filter((tick) => tick.x <= leftRange.x).length; + let rangeData: Array<{ x: number; y: number }> = data.filter( + (tick) => tick.x >= leftRange.x && tick.x <= rightRange.x + ); + + if (!rangeData.length) { + rangeData.push({ + x: Math.max(leftRange.x, plotMin), + y: data[lessThan - 1].y + }); + + rangeData.push({ + x: Math.min(rightRange.x, plotMax), + y: data[lessThan - 1].y + }); + } else { + if (rangeData[0].x > leftRange.x) { + rangeData.unshift({ + x: leftRange.x, + y: rangeData[0].y + }); + } + + if (rangeData[rangeData.length - 1].x < rightRange.x) { + rangeData.push({ + x: rightRange.x, + y: rangeData[rangeData.length - 1].y + }); + } + + const outMinData: Array<{ x: number; y: number }> = rangeData.filter( + (tick) => tick.x < Math.max(plotMin, data[0].x) + ); + const outMaxData: Array<{ x: number; y: number }> = rangeData.filter( + (tick) => tick.x > Math.min(plotMax, data[data.length - 1].x) + ); + const newRangeData: Array<{ x: number; y: number }> = rangeData.slice( + outMinData.length, + rangeData.length - outMaxData.length + ); + + if (!newRangeData.length || newRangeData[0].x > Math.max(plotMin, rangeData[0].x)) { + newRangeData.unshift({ + x: Math.max(plotMin, rangeData[0].x), + y: outMinData.length > 0 ? outMinData[outMinData.length - 1].y : 0 + }); + } + + if (newRangeData[newRangeData.length - 1].x < Math.min(plotMax, rangeData[rangeData.length - 1].x)) { + newRangeData.push({ + x: Math.min(plotMax, rangeData[rangeData.length - 1].x), + y: newRangeData[newRangeData.length - 1].y + }); + } + + rangeData = newRangeData; + } + + return pointsOmitter(rangeData); + }, [disabled, data, leftRange, rightRange, plotMin, plotMax, pointsOmitter]); + + const currentGreaterThanRange = useMemo(() => { + if (!data.length || disabled || rightRange.x > plotMax) { + return []; + } + + let rangeData: Array<{ x: number; y: number }> = data.filter((tick) => tick.x >= rightRange.x); + const outData: Array<{ x: number; y: number }> = data.filter( + (tick) => tick.x > Math.min(plotMax, data[data.length - 1].x) + ); + + if (!rangeData.length) { + return []; + } + + if (rangeData[0].x > rightRange.x) { + rangeData.unshift({ + x: rightRange.x, + y: rangeData[0].y + }); + } + + rangeData = rangeData.slice(0, rangeData.length - outData.length); + + if (rangeData[rangeData.length - 1].x < Math.min(plotMax, data[data.length - 1].x)) { + rangeData.push({ + x: Math.min(plotMax, data[data.length - 1].x), + y: rangeData[rangeData.length - 1].y + }); + } + + return pointsOmitter(rangeData); + }, [disabled, data, rightRange, plotMin, plotMax, pointsOmitter]); + + const currentLayer: Layer = ({ innerWidth, innerHeight }) => { + if (typeof midPrice === 'undefined') { + return null; + } + + const unitLen = innerWidth / (plotMax - plotMin); + return ( + + + + + + + + + + ); + }; + + const bottomLineLayer: Layer = ({ innerWidth, innerHeight }) => { + const bottomLine = innerHeight; + return ; + }; + + const lazyLoadingLayer: Layer = ({ innerWidth, innerHeight }) => { + if (!loading || coverOnLoading) { + return null; + } + + return ( + + + + Loading liquidity data... + + + ); + }; + + const brushLayer = Brush( + leftRange.x, + rightRange.x, + (position) => { + const nearest = nearestTickIndex( + plotMin + position * (plotMax - plotMin), + tickSpacing, + isXtoY, + xDecimal, + yDecimal + ); + onChangeRange?.( + isXtoY ? Math.min(rightRange.index - tickSpacing, nearest) : Math.max(rightRange.index + tickSpacing, nearest), + rightRange.index + ); + }, + (position) => { + const nearest = nearestTickIndex( + plotMin + position * (plotMax - plotMin), + tickSpacing, + isXtoY, + xDecimal, + yDecimal + ); + onChangeRange?.( + leftRange.index, + isXtoY ? Math.max(leftRange.index + tickSpacing, nearest) : Math.min(leftRange.index - tickSpacing, nearest) + ); + }, + plotMin, + plotMax, + disabled + ); + + return ( +
+ {loading && coverOnLoading ? ( +
+ loading-gif +
+ ) : null} + {!loading && hasError ? ( +
+
+

Unable to load liquidity chart

+ +
+
+ ) : null} +
+ + +
+ +
+ ); +}; + +export default PriceRangePlot; diff --git a/src/pages/Pool-V3/components/PriceRangePlot/index.module.scss b/src/pages/Pool-V3/components/PriceRangePlot/index.module.scss new file mode 100644 index 000000000..807267340 --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/index.module.scss @@ -0,0 +1,15 @@ +.container { + margin-top: 32; + height: 100%; + position: relative; + + // '& g > text': { + // stroke: 'none', + // fill: '#A9B6BF!important', + // fontFamily: 'IBM Plex Sans!important', + + // [theme.breakpoints.down('sm')]: { + // fontSize: '8px!important' + // } + // } +} diff --git a/src/pages/Pool-V3/components/PriceRangePlot/utils.ts b/src/pages/Pool-V3/components/PriceRangePlot/utils.ts new file mode 100644 index 000000000..180a1e38a --- /dev/null +++ b/src/pages/Pool-V3/components/PriceRangePlot/utils.ts @@ -0,0 +1,182 @@ +import { + TokenAmount, + SwapError, + alignTickToSpacing, + calculateSqrtPrice, + getMaxTick, + getMinTick, +// getPriceScale +} from 'pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js'; + +export const PRICE_SCALE = 24; +export const CONCENTRATION_FACTOR = 1.00001526069123; + +export const getPrimaryUnitsPrice = (price: number, isXtoY: boolean, xDecimal: number, yDecimal: number) => { + const xToYPrice = isXtoY ? price : 1 / price; + + return xToYPrice * 10 ** (yDecimal - xDecimal); +}; + +export const logBase = (x: number, b: number): number => Math.log(x) / Math.log(b); + +export const adjustToSpacing = (baseTick: number, spacing: number, isGreater: boolean): number => { + const remainder = baseTick % spacing; + + if (Math.abs(remainder) === 0) { + return baseTick; + } + + let adjustment: number; + if (isGreater) { + if (baseTick >= 0) { + adjustment = spacing - remainder; + } else { + adjustment = Math.abs(remainder); + } + } else { + if (baseTick >= 0) { + adjustment = -remainder; + } else { + adjustment = -(spacing - Math.abs(remainder)); + } + } + + return baseTick + adjustment; +}; + +export const spacingMultiplicityLte = (arg: number, spacing: number): number => { + return adjustToSpacing(arg, spacing, false); +}; + +export const spacingMultiplicityGte = (arg: number, spacing: number): number => { + return adjustToSpacing(arg, spacing, true); +}; + +export const nearestSpacingMultiplicity = (centerTick: number, spacing: number) => { + const greaterTick = spacingMultiplicityGte(centerTick, spacing); + const lowerTick = spacingMultiplicityLte(centerTick, spacing); + + const nearestTick = Math.abs(greaterTick - centerTick) < Math.abs(lowerTick - centerTick) ? greaterTick : lowerTick; + + return Math.max(Math.min(nearestTick, Number(getMaxTick(spacing))), Number(getMinTick(spacing))); +}; + +export const getTickAtSqrtPriceFromBalance = ( + price: number, + spacing: number, + isXtoY: boolean, + xDecimal: number, + yDecimal: number +) => { + const minTick = getMinTick(spacing); + const maxTick = getMaxTick(spacing); + + const basePrice = Math.max(price, Number(calcPrice(isXtoY ? minTick : maxTick, isXtoY, xDecimal, yDecimal))); + const primaryUnitsPrice = getPrimaryUnitsPrice(basePrice, isXtoY, Number(xDecimal), Number(yDecimal)); + const tick = Math.round(logBase(primaryUnitsPrice, 1.0001)); + + return Math.max(Math.min(tick, Number(getMaxTick(spacing))), Number(getMinTick(spacing))); +}; + +export const calcPrice = (amountTickIndex: number, isXtoY: boolean, xDecimal: number, yDecimal: number): number => { + const price = calcYPerXPriceByTickIndex(amountTickIndex, xDecimal, yDecimal); + + return isXtoY ? price : 1 / price; +}; + +export const calcYPerXPriceByTickIndex = (tickIndex: number, xDecimal: number, yDecimal: number): number => { + const sqrt = +printBigint(calculateSqrtPrice(tickIndex), PRICE_SCALE); + + const proportion = sqrt * sqrt; + + return proportion / 10 ** (yDecimal - xDecimal); +}; + +export const printBigint = (amount: TokenAmount, decimals: number): string => { + const amountString = amount.toString(); + const isNegative = amountString.length > 0 && amountString[0] === '-'; + + const balanceString = isNegative ? amountString.slice(1) : amountString; + + if (balanceString.length <= decimals) { + return (isNegative ? '-' : '') + '0.' + '0'.repeat(decimals - balanceString.length) + balanceString; + } else { + return ( + (isNegative ? '-' : '') + + trimZeros( + balanceString.substring(0, balanceString.length - decimals) + + '.' + + balanceString.substring(balanceString.length - decimals) + ) + ); + } +}; + +export const trimZeros = (numStr: string): string => { + return numStr + .replace(/(\.\d*?)0+$/, '$1') + .replace(/^0+(\d)|(\d)0+$/gm, '$1$2') + .replace(/\.$/, ''); +}; + +export const nearestTickIndex = ( + price: number, + spacing: number, + isXtoY: boolean, + xDecimal: number, + yDecimal: number +) => { + const tick = getTickAtSqrtPriceFromBalance(price, spacing, isXtoY, xDecimal, yDecimal); + + return nearestSpacingMultiplicity(tick, spacing); +}; + +export const getConcentrationArray = (tickSpacing: number, minimumRange: number, currentTick: number): number[] => { + const concentrations: number[] = []; + let counter = 0; + let concentration = 0; + let lastConcentration = calculateConcentration(tickSpacing, minimumRange, counter) + 1; + let concentrationDelta = 1; + + while (concentrationDelta >= 1) { + concentration = calculateConcentration(tickSpacing, minimumRange, counter); + concentrations.push(concentration); + concentrationDelta = lastConcentration - concentration; + lastConcentration = concentration; + counter++; + } + concentration = Math.ceil(concentrations[concentrations.length - 1]); + + while (concentration > 1) { + concentrations.push(concentration); + concentration--; + } + const maxTick = alignTickToSpacing(getMaxTick(1), tickSpacing); + if ((minimumRange / 2) * tickSpacing > maxTick - Math.abs(currentTick)) { + throw new Error(String(SwapError.TickLimitReached)); + } + const limitIndex = (maxTick - Math.abs(currentTick) - (minimumRange / 2) * tickSpacing) / tickSpacing; + + return concentrations.slice(0, limitIndex); +}; + +export const calculateConcentration = (tickSpacing: number, minimumRange: number, n: number) => { + const concentration = 1 / (1 - Math.pow(1.0001, (-tickSpacing * (minimumRange + 2 * n)) / 4)); + return concentration / CONCENTRATION_FACTOR; +}; + +export const calcTicksAmountInRange = ( + min: number, + max: number, + tickSpacing: number, + isXtoY: boolean, + xDecimal: number, + yDecimal: number +): number => { + const primaryUnitsMin = getPrimaryUnitsPrice(min, isXtoY, xDecimal, yDecimal); + const primaryUnitsMax = getPrimaryUnitsPrice(max, isXtoY, xDecimal, yDecimal); + const minIndex = logBase(primaryUnitsMin, 1.0001); + const maxIndex = logBase(primaryUnitsMax, 1.0001); + + return Math.ceil(Math.abs(maxIndex - minIndex) / tickSpacing); +}; diff --git a/src/pages/Pool-V3/packages/sdk/OraiswapV3.client.ts b/src/pages/Pool-V3/packages/sdk/OraiswapV3.client.ts new file mode 100644 index 000000000..5344d28cc --- /dev/null +++ b/src/pages/Pool-V3/packages/sdk/OraiswapV3.client.ts @@ -0,0 +1,888 @@ +/** + * This file was automatically generated by @oraichain/ts-codegen@0.35.9. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run the @oraichain/ts-codegen generate command to regenerate this file. + */ + +import { CosmWasmClient, SigningCosmWasmClient, ExecuteResult } from '@cosmjs/cosmwasm-stargate' +import { Coin, StdFee } from '@cosmjs/amino' +import { + Percentage, + InstantiateMsg, + ExecuteMsg, + Addr, + Liquidity, + SqrtPrice, + TokenAmount, + PoolKey, + FeeTier, + SwapHop, + QueryMsg, + MigrateMsg, + Boolean, + ArrayOfFeeTier, + ArrayOfLiquidityTick, + LiquidityTick, + Uint32, + FeeGrowth, + Pool, + ArrayOfPoolWithPoolKey, + PoolWithPoolKey, + Position, + ArrayOfPositionTick, + PositionTick, + ArrayOfPosition, + QuoteResult, + Tick, + ArrayOfTupleOfUint16AndUint64 +} from './OraiswapV3.types' +export interface OraiswapV3ReadOnlyInterface { + contractAddress: string + protocolFee: () => Promise + position: ({ index, ownerId }: { index: number; ownerId: Addr }) => Promise + positions: ({ + limit, + offset, + ownerId + }: { + limit?: number + offset?: number + ownerId: Addr + }) => Promise + feeTierExist: ({ feeTier }: { feeTier: FeeTier }) => Promise + pool: ({ + feeTier, + token0, + token1 + }: { + feeTier: FeeTier + token0: string + token1: string + }) => Promise + pools: ({ + limit, + startAfter + }: { + limit?: number + startAfter?: PoolKey + }) => Promise + tick: ({ index, key }: { index: number; key: PoolKey }) => Promise + isTickInitialized: ({ index, key }: { index: number; key: PoolKey }) => Promise + feeTiers: () => Promise + positionTicks: ({ + offset, + owner + }: { + offset: number + owner: Addr + }) => Promise + userPositionAmount: ({ owner }: { owner: Addr }) => Promise + tickMap: ({ + lowerTickIndex, + poolKey, + upperTickIndex, + xToY + }: { + lowerTickIndex: number + poolKey: PoolKey + upperTickIndex: number + xToY: boolean + }) => Promise + liquidityTicks: ({ + poolKey, + tickIndexes + }: { + poolKey: PoolKey + tickIndexes: number[] + }) => Promise + liquidityTicksAmount: ({ + lowerTick, + poolKey, + upperTick + }: { + lowerTick: number + poolKey: PoolKey + upperTick: number + }) => Promise + poolsForPair: ({ + token0, + token1 + }: { + token0: string + token1: string + }) => Promise + quote: ({ + amount, + byAmountIn, + poolKey, + sqrtPriceLimit, + xToY + }: { + amount: TokenAmount + byAmountIn: boolean + poolKey: PoolKey + sqrtPriceLimit: SqrtPrice + xToY: boolean + }) => Promise + quoteRoute: ({ + amountIn, + swaps + }: { + amountIn: TokenAmount + swaps: SwapHop[] + }) => Promise +} +export class OraiswapV3QueryClient implements OraiswapV3ReadOnlyInterface { + client: CosmWasmClient + contractAddress: string + + constructor(client: CosmWasmClient, contractAddress: string) { + this.client = client + this.contractAddress = contractAddress + this.protocolFee = this.protocolFee.bind(this) + this.position = this.position.bind(this) + this.positions = this.positions.bind(this) + this.feeTierExist = this.feeTierExist.bind(this) + this.pool = this.pool.bind(this) + this.pools = this.pools.bind(this) + this.tick = this.tick.bind(this) + this.isTickInitialized = this.isTickInitialized.bind(this) + this.feeTiers = this.feeTiers.bind(this) + this.positionTicks = this.positionTicks.bind(this) + this.userPositionAmount = this.userPositionAmount.bind(this) + this.tickMap = this.tickMap.bind(this) + this.liquidityTicks = this.liquidityTicks.bind(this) + this.liquidityTicksAmount = this.liquidityTicksAmount.bind(this) + this.poolsForPair = this.poolsForPair.bind(this) + this.quote = this.quote.bind(this) + this.quoteRoute = this.quoteRoute.bind(this) + } + + protocolFee = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + protocol_fee: {} + }) + } + position = async ({ index, ownerId }: { index: number; ownerId: Addr }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + position: { + index, + owner_id: ownerId + } + }) + } + positions = async ({ + limit, + offset, + ownerId + }: { + limit?: number + offset?: number + ownerId: Addr + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + positions: { + limit, + offset, + owner_id: ownerId + } + }) + } + feeTierExist = async ({ feeTier }: { feeTier: FeeTier }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + fee_tier_exist: { + fee_tier: feeTier + } + }) + } + pool = async ({ + feeTier, + token0, + token1 + }: { + feeTier: FeeTier + token0: string + token1: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pool: { + fee_tier: feeTier, + token_0: token0, + token_1: token1 + } + }) + } + pools = async ({ + limit, + startAfter + }: { + limit?: number + startAfter?: PoolKey + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pools: { + limit, + start_after: startAfter + } + }) + } + tick = async ({ index, key }: { index: number; key: PoolKey }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + tick: { + index, + key + } + }) + } + isTickInitialized = async ({ index, key }: { index: number; key: PoolKey }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + is_tick_initialized: { + index, + key + } + }) + } + feeTiers = async (): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + fee_tiers: {} + }) + } + positionTicks = async ({ + offset, + owner + }: { + offset: number + owner: Addr + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + position_ticks: { + offset, + owner + } + }) + } + userPositionAmount = async ({ owner }: { owner: Addr }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + user_position_amount: { + owner + } + }) + } + tickMap = async ({ + lowerTickIndex, + poolKey, + upperTickIndex, + xToY + }: { + lowerTickIndex: number + poolKey: PoolKey + upperTickIndex: number + xToY: boolean + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + tick_map: { + lower_tick_index: lowerTickIndex, + pool_key: poolKey, + upper_tick_index: upperTickIndex, + x_to_y: xToY + } + }) + } + liquidityTicks = async ({ + poolKey, + tickIndexes + }: { + poolKey: PoolKey + tickIndexes: number[] + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + liquidity_ticks: { + pool_key: poolKey, + tick_indexes: tickIndexes + } + }) + } + liquidityTicksAmount = async ({ + lowerTick, + poolKey, + upperTick + }: { + lowerTick: number + poolKey: PoolKey + upperTick: number + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + liquidity_ticks_amount: { + lower_tick: lowerTick, + pool_key: poolKey, + upper_tick: upperTick + } + }) + } + poolsForPair = async ({ + token0, + token1 + }: { + token0: string + token1: string + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + pools_for_pair: { + token_0: token0, + token_1: token1 + } + }) + } + quote = async ({ + amount, + byAmountIn, + poolKey, + sqrtPriceLimit, + xToY + }: { + amount: TokenAmount + byAmountIn: boolean + poolKey: PoolKey + sqrtPriceLimit: SqrtPrice + xToY: boolean + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + quote: { + amount, + by_amount_in: byAmountIn, + pool_key: poolKey, + sqrt_price_limit: sqrtPriceLimit, + x_to_y: xToY + } + }) + } + quoteRoute = async ({ + amountIn, + swaps + }: { + amountIn: TokenAmount + swaps: SwapHop[] + }): Promise => { + return this.client.queryContractSmart(this.contractAddress, { + quote_route: { + amount_in: amountIn, + swaps + } + }) + } +} +export interface OraiswapV3Interface extends OraiswapV3ReadOnlyInterface { + contractAddress: string + sender: string + withdrawProtocolFee: ( + { + poolKey + }: { + poolKey: PoolKey + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + changeProtocolFee: ( + { + protocolFee + }: { + protocolFee: Percentage + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + changeFeeReceiver: ( + { + feeReceiver, + poolKey + }: { + feeReceiver: Addr + poolKey: PoolKey + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + createPosition: ( + { + liquidityDelta, + lowerTick, + poolKey, + slippageLimitLower, + slippageLimitUpper, + upperTick + }: { + liquidityDelta: Liquidity + lowerTick: number + poolKey: PoolKey + slippageLimitLower: SqrtPrice + slippageLimitUpper: SqrtPrice + upperTick: number + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + swap: ( + { + amount, + byAmountIn, + poolKey, + sqrtPriceLimit, + xToY + }: { + amount: TokenAmount + byAmountIn: boolean + poolKey: PoolKey + sqrtPriceLimit: SqrtPrice + xToY: boolean + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + swapRoute: ( + { + amountIn, + expectedAmountOut, + slippage, + swaps + }: { + amountIn: TokenAmount + expectedAmountOut: TokenAmount + slippage: Percentage + swaps: SwapHop[] + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + transferPosition: ( + { + index, + receiver + }: { + index: number + receiver: string + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + claimFee: ( + { + index + }: { + index: number + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + removePosition: ( + { + index + }: { + index: number + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + createPool: ( + { + feeTier, + initSqrtPrice, + initTick, + token0, + token1 + }: { + feeTier: FeeTier + initSqrtPrice: SqrtPrice + initTick: number + token0: string + token1: string + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + addFeeTier: ( + { + feeTier + }: { + feeTier: FeeTier + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise + removeFeeTier: ( + { + feeTier + }: { + feeTier: FeeTier + }, + _fee?: number | StdFee | 'auto', + _memo?: string, + _funds?: Coin[] + ) => Promise +} +export class OraiswapV3Client extends OraiswapV3QueryClient implements OraiswapV3Interface { + declare client: SigningCosmWasmClient + sender: string + declare contractAddress: string + + constructor(client: SigningCosmWasmClient, sender: string, contractAddress: string) { + super(client, contractAddress) + this.client = client + this.sender = sender + this.contractAddress = contractAddress + this.withdrawProtocolFee = this.withdrawProtocolFee.bind(this) + this.changeProtocolFee = this.changeProtocolFee.bind(this) + this.changeFeeReceiver = this.changeFeeReceiver.bind(this) + this.createPosition = this.createPosition.bind(this) + this.swap = this.swap.bind(this) + this.swapRoute = this.swapRoute.bind(this) + this.transferPosition = this.transferPosition.bind(this) + this.claimFee = this.claimFee.bind(this) + this.removePosition = this.removePosition.bind(this) + this.createPool = this.createPool.bind(this) + this.addFeeTier = this.addFeeTier.bind(this) + this.removeFeeTier = this.removeFeeTier.bind(this) + } + + withdrawProtocolFee = async ( + { + poolKey + }: { + poolKey: PoolKey + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + withdraw_protocol_fee: { + pool_key: poolKey + } + }, + _fee, + _memo, + _funds + ) + } + changeProtocolFee = async ( + { + protocolFee + }: { + protocolFee: Percentage + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + change_protocol_fee: { + protocol_fee: protocolFee + } + }, + _fee, + _memo, + _funds + ) + } + changeFeeReceiver = async ( + { + feeReceiver, + poolKey + }: { + feeReceiver: Addr + poolKey: PoolKey + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + change_fee_receiver: { + fee_receiver: feeReceiver, + pool_key: poolKey + } + }, + _fee, + _memo, + _funds + ) + } + createPosition = async ( + { + liquidityDelta, + lowerTick, + poolKey, + slippageLimitLower, + slippageLimitUpper, + upperTick + }: { + liquidityDelta: Liquidity + lowerTick: number + poolKey: PoolKey + slippageLimitLower: SqrtPrice + slippageLimitUpper: SqrtPrice + upperTick: number + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + create_position: { + liquidity_delta: liquidityDelta, + lower_tick: lowerTick, + pool_key: poolKey, + slippage_limit_lower: slippageLimitLower, + slippage_limit_upper: slippageLimitUpper, + upper_tick: upperTick + } + }, + _fee, + _memo, + _funds + ) + } + swap = async ( + { + amount, + byAmountIn, + poolKey, + sqrtPriceLimit, + xToY + }: { + amount: TokenAmount + byAmountIn: boolean + poolKey: PoolKey + sqrtPriceLimit: SqrtPrice + xToY: boolean + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + swap: { + amount, + by_amount_in: byAmountIn, + pool_key: poolKey, + sqrt_price_limit: sqrtPriceLimit, + x_to_y: xToY + } + }, + _fee, + _memo, + _funds + ) + } + swapRoute = async ( + { + amountIn, + expectedAmountOut, + slippage, + swaps + }: { + amountIn: TokenAmount + expectedAmountOut: TokenAmount + slippage: Percentage + swaps: SwapHop[] + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + swap_route: { + amount_in: amountIn, + expected_amount_out: expectedAmountOut, + slippage, + swaps + } + }, + _fee, + _memo, + _funds + ) + } + transferPosition = async ( + { + index, + receiver + }: { + index: number + receiver: string + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + transfer_position: { + index, + receiver + } + }, + _fee, + _memo, + _funds + ) + } + claimFee = async ( + { + index + }: { + index: number + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + claim_fee: { + index + } + }, + _fee, + _memo, + _funds + ) + } + removePosition = async ( + { + index + }: { + index: number + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + remove_position: { + index + } + }, + _fee, + _memo, + _funds + ) + } + createPool = async ( + { + feeTier, + initSqrtPrice, + initTick, + token0, + token1 + }: { + feeTier: FeeTier + initSqrtPrice: SqrtPrice + initTick: number + token0: string + token1: string + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + create_pool: { + fee_tier: feeTier, + init_sqrt_price: initSqrtPrice, + init_tick: initTick, + token_0: token0, + token_1: token1 + } + }, + _fee, + _memo, + _funds + ) + } + addFeeTier = async ( + { + feeTier + }: { + feeTier: FeeTier + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + add_fee_tier: { + fee_tier: feeTier + } + }, + _fee, + _memo, + _funds + ) + } + removeFeeTier = async ( + { + feeTier + }: { + feeTier: FeeTier + }, + _fee: number | StdFee | 'auto' = 'auto', + _memo?: string, + _funds?: Coin[] + ): Promise => { + return await this.client.execute( + this.sender, + this.contractAddress, + { + remove_fee_tier: { + fee_tier: feeTier + } + }, + _fee, + _memo, + _funds + ) + } +} diff --git a/src/pages/Pool-V3/packages/sdk/OraiswapV3.types.ts b/src/pages/Pool-V3/packages/sdk/OraiswapV3.types.ts new file mode 100644 index 000000000..3ab945636 --- /dev/null +++ b/src/pages/Pool-V3/packages/sdk/OraiswapV3.types.ts @@ -0,0 +1,238 @@ +export type Percentage = number; +export interface InstantiateMsg { + protocol_fee: Percentage; +} +export type ExecuteMsg = { + withdraw_protocol_fee: { + pool_key: PoolKey; + }; +} | { + change_protocol_fee: { + protocol_fee: Percentage; + }; +} | { + change_fee_receiver: { + fee_receiver: Addr; + pool_key: PoolKey; + }; +} | { + create_position: { + liquidity_delta: Liquidity; + lower_tick: number; + pool_key: PoolKey; + slippage_limit_lower: SqrtPrice; + slippage_limit_upper: SqrtPrice; + upper_tick: number; + }; +} | { + swap: { + amount: TokenAmount; + by_amount_in: boolean; + pool_key: PoolKey; + sqrt_price_limit: SqrtPrice; + x_to_y: boolean; + }; +} | { + swap_route: { + amount_in: TokenAmount; + expected_amount_out: TokenAmount; + slippage: Percentage; + swaps: SwapHop[]; + }; +} | { + transfer_position: { + index: number; + receiver: string; + }; +} | { + claim_fee: { + index: number; + }; +} | { + remove_position: { + index: number; + }; +} | { + create_pool: { + fee_tier: FeeTier; + init_sqrt_price: SqrtPrice; + init_tick: number; + token_0: string; + token_1: string; + }; +} | { + add_fee_tier: { + fee_tier: FeeTier; + }; +} | { + remove_fee_tier: { + fee_tier: FeeTier; + }; +}; +export type Addr = string; +export type Liquidity = string; +export type SqrtPrice = string; +export type TokenAmount = string; +export interface PoolKey { + fee_tier: FeeTier; + token_x: string; + token_y: string; +} +export interface FeeTier { + fee: Percentage; + tick_spacing: number; +} +export interface SwapHop { + pool_key: PoolKey; + x_to_y: boolean; +} +export type QueryMsg = { + protocol_fee: {}; +} | { + position: { + index: number; + owner_id: Addr; + }; +} | { + positions: { + limit?: number | null; + offset?: number | null; + owner_id: Addr; + }; +} | { + fee_tier_exist: { + fee_tier: FeeTier; + }; +} | { + pool: { + fee_tier: FeeTier; + token_0: string; + token_1: string; + }; +} | { + pools: { + limit?: number | null; + start_after?: PoolKey | null; + }; +} | { + tick: { + index: number; + key: PoolKey; + }; +} | { + is_tick_initialized: { + index: number; + key: PoolKey; + }; +} | { + fee_tiers: {}; +} | { + position_ticks: { + offset: number; + owner: Addr; + }; +} | { + user_position_amount: { + owner: Addr; + }; +} | { + tick_map: { + lower_tick_index: number; + pool_key: PoolKey; + upper_tick_index: number; + x_to_y: boolean; + }; +} | { + liquidity_ticks: { + pool_key: PoolKey; + tick_indexes: number[]; + }; +} | { + liquidity_ticks_amount: { + lower_tick: number; + pool_key: PoolKey; + upper_tick: number; + }; +} | { + pools_for_pair: { + token_0: string; + token_1: string; + }; +} | { + quote: { + amount: TokenAmount; + by_amount_in: boolean; + pool_key: PoolKey; + sqrt_price_limit: SqrtPrice; + x_to_y: boolean; + }; +} | { + quote_route: { + amount_in: TokenAmount; + swaps: SwapHop[]; + }; +}; +export interface MigrateMsg {} +export type Boolean = boolean; +export type ArrayOfFeeTier = FeeTier[]; +export type ArrayOfLiquidityTick = LiquidityTick[]; +export interface LiquidityTick { + index: number; + liquidity_change: Liquidity; + sign: boolean; +} +export type Uint32 = number; +export type FeeGrowth = string; +export interface Pool { + current_tick_index: number; + fee_growth_global_x: FeeGrowth; + fee_growth_global_y: FeeGrowth; + fee_protocol_token_x: TokenAmount; + fee_protocol_token_y: TokenAmount; + fee_receiver: string; + last_timestamp: number; + liquidity: Liquidity; + sqrt_price: SqrtPrice; + start_timestamp: number; +} +export type ArrayOfPoolWithPoolKey = PoolWithPoolKey[]; +export interface PoolWithPoolKey { + pool: Pool; + pool_key: PoolKey; +} +export interface Position { + fee_growth_inside_x: FeeGrowth; + fee_growth_inside_y: FeeGrowth; + last_block_number: number; + liquidity: Liquidity; + lower_tick_index: number; + pool_key: PoolKey; + tokens_owed_x: TokenAmount; + tokens_owed_y: TokenAmount; + upper_tick_index: number; +} +export type ArrayOfPositionTick = PositionTick[]; +export interface PositionTick { + fee_growth_outside_x: FeeGrowth; + fee_growth_outside_y: FeeGrowth; + index: number; + seconds_outside: number; +} +export type ArrayOfPosition = Position[]; +export interface QuoteResult { + amount_in: TokenAmount; + amount_out: TokenAmount; + target_sqrt_price: SqrtPrice; + ticks: Tick[]; +} +export interface Tick { + fee_growth_outside_x: FeeGrowth; + fee_growth_outside_y: FeeGrowth; + index: number; + liquidity_change: Liquidity; + liquidity_gross: Liquidity; + seconds_outside: number; + sign: boolean; + sqrt_price: SqrtPrice; +} +export type ArrayOfTupleOfUint16AndUint64 = [number, number][]; \ No newline at end of file diff --git a/src/pages/Pool-V3/packages/sdk/index.ts b/src/pages/Pool-V3/packages/sdk/index.ts new file mode 100644 index 000000000..eaeabd373 --- /dev/null +++ b/src/pages/Pool-V3/packages/sdk/index.ts @@ -0,0 +1,2 @@ +export * as OraiswapV3Types from './OraiswapV3.types'; +export * from './OraiswapV3.client'; \ No newline at end of file diff --git a/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.d.ts b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.d.ts new file mode 100644 index 000000000..b57135354 --- /dev/null +++ b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.d.ts @@ -0,0 +1,646 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {SqrtPrice} current_sqrt_price +* @param {SqrtPrice} target_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} by_amount_in +* @param {Percentage} fee +* @returns {SwapResult} +*/ +export function computeSwapStep(current_sqrt_price: SqrtPrice, target_sqrt_price: SqrtPrice, liquidity: Liquidity, amount: TokenAmount, by_amount_in: boolean, fee: Percentage): SwapResult; +/** +* @param {SqrtPrice} sqrt_price_a +* @param {SqrtPrice} sqrt_price_b +* @param {Liquidity} liquidity +* @param {boolean} rounding_up +* @returns {TokenAmount} +*/ +export function getDeltaX(sqrt_price_a: SqrtPrice, sqrt_price_b: SqrtPrice, liquidity: Liquidity, rounding_up: boolean): TokenAmount; +/** +* @param {SqrtPrice} sqrt_price_a +* @param {SqrtPrice} sqrt_price_b +* @param {Liquidity} liquidity +* @param {boolean} rounding_up +* @returns {TokenAmount} +*/ +export function getDeltaY(sqrt_price_a: SqrtPrice, sqrt_price_b: SqrtPrice, liquidity: Liquidity, rounding_up: boolean): TokenAmount; +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} x_to_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceFromInput(starting_sqrt_price: SqrtPrice, liquidity: Liquidity, amount: TokenAmount, x_to_y: boolean): SqrtPrice; +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} x_to_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceFromOutput(starting_sqrt_price: SqrtPrice, liquidity: Liquidity, amount: TokenAmount, x_to_y: boolean): SqrtPrice; +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} x +* @param {boolean} add_x +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceXUp(starting_sqrt_price: SqrtPrice, liquidity: Liquidity, x: TokenAmount, add_x: boolean): SqrtPrice; +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} y +* @param {boolean} add_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceYDown(starting_sqrt_price: SqrtPrice, liquidity: Liquidity, y: TokenAmount, add_y: boolean): SqrtPrice; +/** +* @param {number} current_tick_index +* @param {SqrtPrice} current_sqrt_price +* @param {Liquidity} liquidity_delta +* @param {boolean} liquidity_sign +* @param {number} upper_tick +* @param {number} lower_tick +* @returns {AmountDeltaResult} +*/ +export function calculateAmountDelta(current_tick_index: number, current_sqrt_price: SqrtPrice, liquidity_delta: Liquidity, liquidity_sign: boolean, upper_tick: number, lower_tick: number): AmountDeltaResult; +/** +* @param {TokenAmount} amount +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {Percentage} fee +* @param {boolean} by_amount_in +* @param {boolean} x_to_y +* @returns {boolean} +*/ +export function isEnoughAmountToChangePrice(amount: TokenAmount, starting_sqrt_price: SqrtPrice, liquidity: Liquidity, fee: Percentage, by_amount_in: boolean, x_to_y: boolean): boolean; +/** +* @param {number} tick_spacing +* @returns {Liquidity} +*/ +export function calculateMaxLiquidityPerTick(tick_spacing: number): Liquidity; +/** +* @param {number} tick_lower +* @param {number} tick_upper +* @param {number} tick_spacing +*/ +export function checkTicks(tick_lower: number, tick_upper: number, tick_spacing: number): void; +/** +* @param {number} tick_index +* @param {number} tick_spacing +*/ +export function checkTick(tick_index: number, tick_spacing: number): void; +/** +* @param {TokenAmount} expected_amount_out +* @param {Percentage} slippage +* @returns {TokenAmount} +*/ +export function calculateMinAmountOut(expected_amount_out: TokenAmount, slippage: Percentage): TokenAmount; +/** +* @param {number} tick +* @param {number} tick_spacing +* @returns {PositionResult} +*/ +export function tickToPositionJs(tick: number, tick_spacing: number): PositionResult; +/** +* @param {number} chunk +* @param {number} bit +* @param {number} tick_spacing +* @returns {number} +*/ +export function positionToTick(chunk: number, bit: number, tick_spacing: number): number; +/** +* @returns {bigint} +*/ +export function getGlobalMaxSqrtPrice(): bigint; +/** +* @returns {bigint} +*/ +export function getGlobalMinSqrtPrice(): bigint; +/** +* @returns {number} +*/ +export function getTickSearchRange(): number; +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMaxChunk(tick_spacing: number): number; +/** +* @returns {number} +*/ +export function getChunkSize(): number; +/** +* @returns {number} +*/ +export function getMaxTickCross(): number; +/** +* @returns {number} +*/ +export function getMaxTickmapQuerySize(): number; +/** +* @returns {number} +*/ +export function getLiquidityTicksLimit(): number; +/** +* @returns {number} +*/ +export function getMaxPoolKeysReturned(): number; +/** +* @returns {number} +*/ +export function getMaxPoolPairsReturned(): number; +/** +* @param {number} lower_tick_index +* @param {FeeGrowth} lower_tick_fee_growth_outside_x +* @param {FeeGrowth} lower_tick_fee_growth_outside_y +* @param {number} upper_tick_index +* @param {FeeGrowth} upper_tick_fee_growth_outside_x +* @param {FeeGrowth} upper_tick_fee_growth_outside_y +* @param {number} pool_current_tick_index +* @param {FeeGrowth} pool_fee_growth_global_x +* @param {FeeGrowth} pool_fee_growth_global_y +* @param {FeeGrowth} position_fee_growth_inside_x +* @param {FeeGrowth} position_fee_growth_inside_y +* @param {Liquidity} position_liquidity +* @returns {TokenAmounts} +*/ +export function calculateFee(lower_tick_index: number, lower_tick_fee_growth_outside_x: FeeGrowth, lower_tick_fee_growth_outside_y: FeeGrowth, upper_tick_index: number, upper_tick_fee_growth_outside_x: FeeGrowth, upper_tick_fee_growth_outside_y: FeeGrowth, pool_current_tick_index: number, pool_fee_growth_global_x: FeeGrowth, pool_fee_growth_global_y: FeeGrowth, position_fee_growth_inside_x: FeeGrowth, position_fee_growth_inside_y: FeeGrowth, position_liquidity: Liquidity): TokenAmounts; +/** +* @param {string} token_candidate +* @param {string} token_to_compare +* @returns {boolean} +*/ +export function isTokenX(token_candidate: string, token_to_compare: string): boolean; +/** +* @param {number} tick_index +* @param {number} tick_spacing +* @param {SqrtPrice} sqrt_price +* @returns {boolean} +*/ +export function checkTickToSqrtPriceRelationship(tick_index: number, tick_spacing: number, sqrt_price: SqrtPrice): boolean; +/** +* @param {number} accurate_tick +* @param {number} tick_spacing +* @returns {number} +*/ +export function alignTickToSpacing(accurate_tick: number, tick_spacing: number): number; +/** +* @param {SqrtPrice} sqrt_price +* @param {number} tick_spacing +* @returns {number} +*/ +export function getTickAtSqrtPrice(sqrt_price: SqrtPrice, tick_spacing: number): number; +/** +* @param {TokenAmount} x +* @param {number} lower_tick +* @param {number} upper_tick +* @param {SqrtPrice} current_sqrt_price +* @param {boolean} rounding_up +* @returns {SingleTokenLiquidity} +*/ +export function getLiquidityByX(x: TokenAmount, lower_tick: number, upper_tick: number, current_sqrt_price: SqrtPrice, rounding_up: boolean): SingleTokenLiquidity; +/** +* @param {TokenAmount} y +* @param {number} lower_tick +* @param {number} upper_tick +* @param {SqrtPrice} current_sqrt_price +* @param {boolean} rounding_up +* @returns {SingleTokenLiquidity} +*/ +export function getLiquidityByY(y: TokenAmount, lower_tick: number, upper_tick: number, current_sqrt_price: SqrtPrice, rounding_up: boolean): SingleTokenLiquidity; +/** +* @param {Percentage} fee +* @param {number} tick_spacing +* @returns {FeeTier} +*/ +export function newFeeTier(fee: Percentage, tick_spacing: number): FeeTier; +/** +* @param {string} token_0 +* @param {string} token_1 +* @param {FeeTier} fee_tier +* @returns {PoolKey} +*/ +export function newPoolKey(token_0: string, token_1: string, fee_tier: FeeTier): PoolKey; +/** +* @param {Tickmap} tickmap +* @param {FeeTier} fee_tier +* @param {Pool} pool +* @param {LiquidityTickVec} ticks +* @param {boolean} x_to_y +* @param {TokenAmount} amount +* @param {boolean} by_amount_in +* @param {SqrtPrice} sqrt_price_limit +* @returns {CalculateSwapResult} +*/ +export function simulateSwap(tickmap: Tickmap, fee_tier: FeeTier, pool: Pool, ticks: LiquidityTickVec, x_to_y: boolean, amount: TokenAmount, by_amount_in: boolean, sqrt_price_limit: SqrtPrice): CalculateSwapResult; +/** +* @returns {bigint} +*/ +export function getFeeGrowthScale(): bigint; +/** +* @returns {bigint} +*/ +export function getFeeGrowthDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toFeeGrowth(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getFixedPointScale(): bigint; +/** +* @returns {bigint} +*/ +export function getFixedPointDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toFixedPoint(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getLiquidityScale(): bigint; +/** +* @returns {bigint} +*/ +export function getLiquidityDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toLiquidity(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getPercentageScale(): bigint; +/** +* @returns {bigint} +*/ +export function getPercentageDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toPercentage(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getPriceScale(): bigint; +/** +* @returns {bigint} +*/ +export function getPriceDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toPrice(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getSecondsPerLiquidityScale(): bigint; +/** +* @returns {bigint} +*/ +export function getSecondsPerLiquidityDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toSecondsPerLiquidity(integer: bigint, scale?: number): bigint; +/** +* @returns {bigint} +*/ +export function getSqrtPriceScale(): bigint; +/** +* @returns {bigint} +*/ +export function getSqrtPriceDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toSqrtPrice(integer: bigint, scale?: number): bigint; +/** +* @param {number} tick_index +* @returns {SqrtPrice} +*/ +export function calculateSqrtPrice(tick_index: number): SqrtPrice; +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMaxTick(tick_spacing: number): number; +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMinTick(tick_spacing: number): number; +/** +* @param {number} tick_spacing +* @returns {SqrtPrice} +*/ +export function getMaxSqrtPrice(tick_spacing: number): SqrtPrice; +/** +* @param {number} tick_spacing +* @returns {SqrtPrice} +*/ +export function getMinSqrtPrice(tick_spacing: number): SqrtPrice; +/** +* @returns {bigint} +*/ +export function getTokenAmountScale(): bigint; +/** +* @returns {bigint} +*/ +export function getTokenAmountDenominator(): bigint; +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toTokenAmount(integer: bigint, scale?: number): bigint; +/** +*/ +export enum SwapError { + NotAdmin = 0, + NotFeeReceiver = 1, + PoolAlreadyExist = 2, + PoolNotFound = 3, + TickAlreadyExist = 4, + InvalidTickIndexOrTickSpacing = 5, + PositionNotFound = 6, + TickNotFound = 7, + FeeTierNotFound = 8, + PoolKeyNotFound = 9, + AmountIsZero = 10, + WrongLimit = 11, + PriceLimitReached = 12, + NoGainSwap = 13, + InvalidTickSpacing = 14, + FeeTierAlreadyExist = 15, + PoolKeyAlreadyExist = 16, + UnauthorizedFeeReceiver = 17, + ZeroLiquidity = 18, + TransferError = 19, + TokensAreSame = 20, + AmountUnderMinimumAmountOut = 21, + InvalidFee = 22, + NotEmptyTickDeinitialization = 23, + InvalidInitTick = 24, + InvalidInitSqrtPrice = 25, + TickLimitReached = 26, + NoRouteFound = 27, + MaxTicksCrossed = 28, + StateOutdated = 29, + InsufficientLiquidity = 30, +} +export interface AmountDeltaResult { + x: TokenAmount; + y: TokenAmount; + update_liquidity: boolean; +} + +export interface SwapResult { + next_sqrt_price: SqrtPrice; + amount_in: TokenAmount; + amount_out: TokenAmount; + fee_amount: TokenAmount; +} + +export interface Tickmap { + bitmap: Map; +} + +export interface PositionResult { + chunk: number; + bit: number; +} + +export interface SwapHop { + pool_key: PoolKey; + x_to_y: boolean; +} + +export interface QuoteResult { + amount_in: TokenAmount; + amount_out: TokenAmount; + target_sqrt_price: SqrtPrice; + ticks: Tick[]; +} + +export interface TokenAmounts { + x: TokenAmount; + y: TokenAmount; +} + +export interface SingleTokenLiquidity { + l: Liquidity; + amount: TokenAmount; +} + +export interface Config { + admin: string; + protocol_fee: Percentage; +} + +export interface FeeTier { + fee: Percentage; + tick_spacing: number; +} + +export interface Pool { + liquidity: Liquidity; + sqrt_price: SqrtPrice; + current_tick_index: number; + fee_growth_global_x: FeeGrowth; + fee_growth_global_y: FeeGrowth; + fee_protocol_token_x: TokenAmount; + fee_protocol_token_y: TokenAmount; + start_timestamp: number; + last_timestamp: number; + fee_receiver: string; +} + +export interface PoolKey { + token_x: string; + token_y: string; + fee_tier: FeeTier; +} + +export interface Position { + pool_key: PoolKey; + liquidity: Liquidity; + lower_tick_index: number; + upper_tick_index: number; + fee_growth_inside_x: FeeGrowth; + fee_growth_inside_y: FeeGrowth; + last_block_number: number; + tokens_owed_x: TokenAmount; + tokens_owed_y: TokenAmount; +} + +export interface Tick { + index: number; + sign: boolean; + liquidity_change: Liquidity; + liquidity_gross: Liquidity; + sqrt_price: SqrtPrice; + fee_growth_outside_x: FeeGrowth; + fee_growth_outside_y: FeeGrowth; + seconds_outside: number; +} + +export interface PositionTick { + index: number; + fee_growth_outside_x: FeeGrowth; + fee_growth_outside_y: FeeGrowth; + seconds_outside: number; +} + +export interface LiquidityTick { + index: number; + liquidity_change: Liquidity; + sign: boolean; +} + +export type LiquidityTickVec = LiquidityTick[]; + +export type FeeGrowth = bigint; + +export type FixedPoint = bigint; + +export type Liquidity = bigint; + +export type Percentage = number; + +export type Price = bigint; + +export type SecondsPerLiquidity = bigint; + +export type SqrtPrice = bigint; + +export type TokenAmount = bigint; + +export interface CalculateSwapResult { + amount_in: TokenAmount; + amount_out: TokenAmount; + fee: TokenAmount; + start_sqrt_price: SqrtPrice; + target_sqrt_price: SqrtPrice; + crossed_ticks: LiquidityTick[]; + global_insufficient_liquidity: boolean; + state_outdated: boolean; + max_ticks_crossed: boolean; +} + + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly computeSwapStep: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void; + readonly getDeltaX: (a: number, b: number, c: number, d: number, e: number) => void; + readonly getDeltaY: (a: number, b: number, c: number, d: number, e: number) => void; + readonly getNextSqrtPriceFromInput: (a: number, b: number, c: number, d: number, e: number) => void; + readonly getNextSqrtPriceFromOutput: (a: number, b: number, c: number, d: number, e: number) => void; + readonly getNextSqrtPriceXUp: (a: number, b: number, c: number, d: number, e: number) => void; + readonly getNextSqrtPriceYDown: (a: number, b: number, c: number, d: number, e: number) => void; + readonly calculateAmountDelta: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void; + readonly isEnoughAmountToChangePrice: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => void; + readonly calculateMaxLiquidityPerTick: (a: number) => number; + readonly checkTicks: (a: number, b: number, c: number, d: number) => void; + readonly checkTick: (a: number, b: number, c: number) => void; + readonly calculateMinAmountOut: (a: number, b: number) => number; + readonly tickToPositionJs: (a: number, b: number, c: number) => void; + readonly positionToTick: (a: number, b: number, c: number) => number; + readonly getGlobalMaxSqrtPrice: () => number; + readonly getGlobalMinSqrtPrice: () => number; + readonly getTickSearchRange: () => number; + readonly getMaxChunk: (a: number) => number; + readonly getChunkSize: () => number; + readonly getMaxTickCross: () => number; + readonly getMaxTickmapQuerySize: () => number; + readonly getLiquidityTicksLimit: () => number; + readonly getMaxPoolKeysReturned: () => number; + readonly getMaxPoolPairsReturned: () => number; + readonly calculateFee: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number) => void; + readonly isTokenX: (a: number, b: number, c: number, d: number, e: number) => void; + readonly checkTickToSqrtPriceRelationship: (a: number, b: number, c: number, d: number) => void; + readonly alignTickToSpacing: (a: number, b: number) => number; + readonly getTickAtSqrtPrice: (a: number, b: number, c: number) => void; + readonly getLiquidityByX: (a: number, b: number, c: number, d: number, e: number, f: number) => void; + readonly getLiquidityByY: (a: number, b: number, c: number, d: number, e: number, f: number) => void; + readonly newFeeTier: (a: number, b: number, c: number) => void; + readonly newPoolKey: (a: number, b: number, c: number, d: number, e: number, f: number) => void; + readonly simulateSwap: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => void; + readonly getFeeGrowthScale: () => number; + readonly getFeeGrowthDenominator: () => number; + readonly toFeeGrowth: (a: number, b: number) => number; + readonly getFixedPointScale: () => number; + readonly getFixedPointDenominator: () => number; + readonly toFixedPoint: (a: number, b: number) => number; + readonly getLiquidityScale: () => number; + readonly getLiquidityDenominator: () => number; + readonly toLiquidity: (a: number, b: number) => number; + readonly getPercentageDenominator: () => number; + readonly toPercentage: (a: number, b: number) => number; + readonly getPriceScale: () => number; + readonly getPriceDenominator: () => number; + readonly toPrice: (a: number, b: number) => number; + readonly toSecondsPerLiquidity: (a: number, b: number) => number; + readonly toSqrtPrice: (a: number, b: number) => number; + readonly calculateSqrtPrice: (a: number, b: number) => void; + readonly getMaxTick: (a: number) => number; + readonly getMinTick: (a: number) => number; + readonly getMaxSqrtPrice: (a: number) => number; + readonly getMinSqrtPrice: (a: number) => number; + readonly getTokenAmountScale: () => number; + readonly getTokenAmountDenominator: () => number; + readonly toTokenAmount: (a: number, b: number) => number; + readonly getSecondsPerLiquidityDenominator: () => number; + readonly getSqrtPriceDenominator: () => number; + readonly getPercentageScale: () => number; + readonly getSecondsPerLiquidityScale: () => number; + readonly getSqrtPriceScale: () => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_exn_store: (a: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js new file mode 100644 index 000000000..6da64c749 --- /dev/null +++ b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm.js @@ -0,0 +1,1145 @@ +/* eslint-disable no-undef */ +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function getObject(idx) { return heap[idx]; } + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} +/** +* @param {SqrtPrice} current_sqrt_price +* @param {SqrtPrice} target_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} by_amount_in +* @param {Percentage} fee +* @returns {SwapResult} +*/ +export function computeSwapStep(current_sqrt_price, target_sqrt_price, liquidity, amount, by_amount_in, fee) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.computeSwapStep(retptr, addHeapObject(current_sqrt_price), addHeapObject(target_sqrt_price), addHeapObject(liquidity), addHeapObject(amount), by_amount_in, addHeapObject(fee)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} sqrt_price_a +* @param {SqrtPrice} sqrt_price_b +* @param {Liquidity} liquidity +* @param {boolean} rounding_up +* @returns {TokenAmount} +*/ +export function getDeltaX(sqrt_price_a, sqrt_price_b, liquidity, rounding_up) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getDeltaX(retptr, addHeapObject(sqrt_price_a), addHeapObject(sqrt_price_b), addHeapObject(liquidity), rounding_up); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} sqrt_price_a +* @param {SqrtPrice} sqrt_price_b +* @param {Liquidity} liquidity +* @param {boolean} rounding_up +* @returns {TokenAmount} +*/ +export function getDeltaY(sqrt_price_a, sqrt_price_b, liquidity, rounding_up) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getDeltaY(retptr, addHeapObject(sqrt_price_a), addHeapObject(sqrt_price_b), addHeapObject(liquidity), rounding_up); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} x_to_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceFromInput(starting_sqrt_price, liquidity, amount, x_to_y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getNextSqrtPriceFromInput(retptr, addHeapObject(starting_sqrt_price), addHeapObject(liquidity), addHeapObject(amount), x_to_y); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} amount +* @param {boolean} x_to_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceFromOutput(starting_sqrt_price, liquidity, amount, x_to_y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getNextSqrtPriceFromOutput(retptr, addHeapObject(starting_sqrt_price), addHeapObject(liquidity), addHeapObject(amount), x_to_y); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} x +* @param {boolean} add_x +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceXUp(starting_sqrt_price, liquidity, x, add_x) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getNextSqrtPriceXUp(retptr, addHeapObject(starting_sqrt_price), addHeapObject(liquidity), addHeapObject(x), add_x); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {TokenAmount} y +* @param {boolean} add_y +* @returns {SqrtPrice} +*/ +export function getNextSqrtPriceYDown(starting_sqrt_price, liquidity, y, add_y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getNextSqrtPriceYDown(retptr, addHeapObject(starting_sqrt_price), addHeapObject(liquidity), addHeapObject(y), add_y); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} current_tick_index +* @param {SqrtPrice} current_sqrt_price +* @param {Liquidity} liquidity_delta +* @param {boolean} liquidity_sign +* @param {number} upper_tick +* @param {number} lower_tick +* @returns {AmountDeltaResult} +*/ +export function calculateAmountDelta(current_tick_index, current_sqrt_price, liquidity_delta, liquidity_sign, upper_tick, lower_tick) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.calculateAmountDelta(retptr, current_tick_index, addHeapObject(current_sqrt_price), addHeapObject(liquidity_delta), liquidity_sign, upper_tick, lower_tick); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {TokenAmount} amount +* @param {SqrtPrice} starting_sqrt_price +* @param {Liquidity} liquidity +* @param {Percentage} fee +* @param {boolean} by_amount_in +* @param {boolean} x_to_y +* @returns {boolean} +*/ +export function isEnoughAmountToChangePrice(amount, starting_sqrt_price, liquidity, fee, by_amount_in, x_to_y) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.isEnoughAmountToChangePrice(retptr, addHeapObject(amount), addHeapObject(starting_sqrt_price), addHeapObject(liquidity), addHeapObject(fee), by_amount_in, x_to_y); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0 !== 0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} tick_spacing +* @returns {Liquidity} +*/ +export function calculateMaxLiquidityPerTick(tick_spacing) { + const ret = wasm.calculateMaxLiquidityPerTick(tick_spacing); + return takeObject(ret); +} + +/** +* @param {number} tick_lower +* @param {number} tick_upper +* @param {number} tick_spacing +*/ +export function checkTicks(tick_lower, tick_upper, tick_spacing) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.checkTicks(retptr, tick_lower, tick_upper, tick_spacing); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} tick_index +* @param {number} tick_spacing +*/ +export function checkTick(tick_index, tick_spacing) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.checkTick(retptr, tick_index, tick_spacing); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {TokenAmount} expected_amount_out +* @param {Percentage} slippage +* @returns {TokenAmount} +*/ +export function calculateMinAmountOut(expected_amount_out, slippage) { + const ret = wasm.calculateMinAmountOut(addHeapObject(expected_amount_out), addHeapObject(slippage)); + return takeObject(ret); +} + +/** +* @param {number} tick +* @param {number} tick_spacing +* @returns {PositionResult} +*/ +export function tickToPositionJs(tick, tick_spacing) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.tickToPositionJs(retptr, tick, tick_spacing); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} chunk +* @param {number} bit +* @param {number} tick_spacing +* @returns {number} +*/ +export function positionToTick(chunk, bit, tick_spacing) { + const ret = wasm.positionToTick(chunk, bit, tick_spacing); + return ret; +} + +/** +* @returns {bigint} +*/ +export function getGlobalMaxSqrtPrice() { + const ret = wasm.getGlobalMaxSqrtPrice(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getGlobalMinSqrtPrice() { + const ret = wasm.getGlobalMinSqrtPrice(); + return takeObject(ret); +} + +/** +* @returns {number} +*/ +export function getTickSearchRange() { + const ret = wasm.getTickSearchRange(); + return ret; +} + +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMaxChunk(tick_spacing) { + const ret = wasm.getMaxChunk(tick_spacing); + return ret; +} + +/** +* @returns {number} +*/ +export function getChunkSize() { + const ret = wasm.getChunkSize(); + return ret; +} + +/** +* @returns {number} +*/ +export function getMaxTickCross() { + const ret = wasm.getMaxTickCross(); + return ret; +} + +/** +* @returns {number} +*/ +export function getMaxTickmapQuerySize() { + const ret = wasm.getMaxTickmapQuerySize(); + return ret >>> 0; +} + +/** +* @returns {number} +*/ +export function getLiquidityTicksLimit() { + const ret = wasm.getLiquidityTicksLimit(); + return ret >>> 0; +} + +/** +* @returns {number} +*/ +export function getMaxPoolKeysReturned() { + const ret = wasm.getMaxPoolKeysReturned(); + return ret; +} + +/** +* @returns {number} +*/ +export function getMaxPoolPairsReturned() { + const ret = wasm.getMaxPoolPairsReturned(); + return ret >>> 0; +} + +/** +* @param {number} lower_tick_index +* @param {FeeGrowth} lower_tick_fee_growth_outside_x +* @param {FeeGrowth} lower_tick_fee_growth_outside_y +* @param {number} upper_tick_index +* @param {FeeGrowth} upper_tick_fee_growth_outside_x +* @param {FeeGrowth} upper_tick_fee_growth_outside_y +* @param {number} pool_current_tick_index +* @param {FeeGrowth} pool_fee_growth_global_x +* @param {FeeGrowth} pool_fee_growth_global_y +* @param {FeeGrowth} position_fee_growth_inside_x +* @param {FeeGrowth} position_fee_growth_inside_y +* @param {Liquidity} position_liquidity +* @returns {TokenAmounts} +*/ +export function calculateFee(lower_tick_index, lower_tick_fee_growth_outside_x, lower_tick_fee_growth_outside_y, upper_tick_index, upper_tick_fee_growth_outside_x, upper_tick_fee_growth_outside_y, pool_current_tick_index, pool_fee_growth_global_x, pool_fee_growth_global_y, position_fee_growth_inside_x, position_fee_growth_inside_y, position_liquidity) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.calculateFee(retptr, lower_tick_index, addHeapObject(lower_tick_fee_growth_outside_x), addHeapObject(lower_tick_fee_growth_outside_y), upper_tick_index, addHeapObject(upper_tick_fee_growth_outside_x), addHeapObject(upper_tick_fee_growth_outside_y), pool_current_tick_index, addHeapObject(pool_fee_growth_global_x), addHeapObject(pool_fee_growth_global_y), addHeapObject(position_fee_growth_inside_x), addHeapObject(position_fee_growth_inside_y), addHeapObject(position_liquidity)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {string} token_candidate +* @param {string} token_to_compare +* @returns {boolean} +*/ +export function isTokenX(token_candidate, token_to_compare) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(token_candidate, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(token_to_compare, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.isTokenX(retptr, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0 !== 0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} tick_index +* @param {number} tick_spacing +* @param {SqrtPrice} sqrt_price +* @returns {boolean} +*/ +export function checkTickToSqrtPriceRelationship(tick_index, tick_spacing, sqrt_price) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.checkTickToSqrtPriceRelationship(retptr, tick_index, tick_spacing, addHeapObject(sqrt_price)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0 !== 0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} accurate_tick +* @param {number} tick_spacing +* @returns {number} +*/ +export function alignTickToSpacing(accurate_tick, tick_spacing) { + const ret = wasm.alignTickToSpacing(accurate_tick, tick_spacing); + return ret; +} + +/** +* @param {SqrtPrice} sqrt_price +* @param {number} tick_spacing +* @returns {number} +*/ +export function getTickAtSqrtPrice(sqrt_price, tick_spacing) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getTickAtSqrtPrice(retptr, addHeapObject(sqrt_price), tick_spacing); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return r0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {TokenAmount} x +* @param {number} lower_tick +* @param {number} upper_tick +* @param {SqrtPrice} current_sqrt_price +* @param {boolean} rounding_up +* @returns {SingleTokenLiquidity} +*/ +export function getLiquidityByX(x, lower_tick, upper_tick, current_sqrt_price, rounding_up) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getLiquidityByX(retptr, addHeapObject(x), lower_tick, upper_tick, addHeapObject(current_sqrt_price), rounding_up); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {TokenAmount} y +* @param {number} lower_tick +* @param {number} upper_tick +* @param {SqrtPrice} current_sqrt_price +* @param {boolean} rounding_up +* @returns {SingleTokenLiquidity} +*/ +export function getLiquidityByY(y, lower_tick, upper_tick, current_sqrt_price, rounding_up) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.getLiquidityByY(retptr, addHeapObject(y), lower_tick, upper_tick, addHeapObject(current_sqrt_price), rounding_up); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {Percentage} fee +* @param {number} tick_spacing +* @returns {FeeTier} +*/ +export function newFeeTier(fee, tick_spacing) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.newFeeTier(retptr, addHeapObject(fee), tick_spacing); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {string} token_0 +* @param {string} token_1 +* @param {FeeTier} fee_tier +* @returns {PoolKey} +*/ +export function newPoolKey(token_0, token_1, fee_tier) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(token_0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(token_1, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.newPoolKey(retptr, ptr0, len0, ptr1, len1, addHeapObject(fee_tier)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {Tickmap} tickmap +* @param {FeeTier} fee_tier +* @param {Pool} pool +* @param {LiquidityTickVec} ticks +* @param {boolean} x_to_y +* @param {TokenAmount} amount +* @param {boolean} by_amount_in +* @param {SqrtPrice} sqrt_price_limit +* @returns {CalculateSwapResult} +*/ +export function simulateSwap(tickmap, fee_tier, pool, ticks, x_to_y, amount, by_amount_in, sqrt_price_limit) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.simulateSwap(retptr, addHeapObject(tickmap), addHeapObject(fee_tier), addHeapObject(pool), addHeapObject(ticks), x_to_y, addHeapObject(amount), by_amount_in, addHeapObject(sqrt_price_limit)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @returns {bigint} +*/ +export function getFeeGrowthScale() { + const ret = wasm.getFeeGrowthScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getFeeGrowthDenominator() { + const ret = wasm.getFeeGrowthDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toFeeGrowth(integer, scale) { + const ret = wasm.toFeeGrowth(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getFixedPointScale() { + const ret = wasm.getFixedPointScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getFixedPointDenominator() { + const ret = wasm.getFixedPointDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toFixedPoint(integer, scale) { + const ret = wasm.toFixedPoint(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getLiquidityScale() { + const ret = wasm.getLiquidityScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getLiquidityDenominator() { + const ret = wasm.getLiquidityDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toLiquidity(integer, scale) { + const ret = wasm.toLiquidity(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getPercentageScale() { + const ret = wasm.getFixedPointScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getPercentageDenominator() { + const ret = wasm.getPercentageDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toPercentage(integer, scale) { + const ret = wasm.toPercentage(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getPriceScale() { + const ret = wasm.getPriceScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getPriceDenominator() { + const ret = wasm.getPriceDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toPrice(integer, scale) { + const ret = wasm.toPrice(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getSecondsPerLiquidityScale() { + const ret = wasm.getPriceScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getSecondsPerLiquidityDenominator() { + const ret = wasm.getPriceDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toSecondsPerLiquidity(integer, scale) { + const ret = wasm.toSecondsPerLiquidity(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getSqrtPriceScale() { + const ret = wasm.getPriceScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getSqrtPriceDenominator() { + const ret = wasm.getPriceDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toSqrtPrice(integer, scale) { + const ret = wasm.toSqrtPrice(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +/** +* @param {number} tick_index +* @returns {SqrtPrice} +*/ +export function calculateSqrtPrice(tick_index) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.calculateSqrtPrice(retptr, tick_index); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); + } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMaxTick(tick_spacing) { + const ret = wasm.getMaxTick(tick_spacing); + return ret; +} + +/** +* @param {number} tick_spacing +* @returns {number} +*/ +export function getMinTick(tick_spacing) { + const ret = wasm.getMinTick(tick_spacing); + return ret; +} + +/** +* @param {number} tick_spacing +* @returns {SqrtPrice} +*/ +export function getMaxSqrtPrice(tick_spacing) { + const ret = wasm.getMaxSqrtPrice(tick_spacing); + return takeObject(ret); +} + +/** +* @param {number} tick_spacing +* @returns {SqrtPrice} +*/ +export function getMinSqrtPrice(tick_spacing) { + const ret = wasm.getMinSqrtPrice(tick_spacing); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getTokenAmountScale() { + const ret = wasm.getTokenAmountScale(); + return takeObject(ret); +} + +/** +* @returns {bigint} +*/ +export function getTokenAmountDenominator() { + const ret = wasm.getTokenAmountDenominator(); + return takeObject(ret); +} + +/** +* @param {bigint} integer +* @param {number | undefined} [scale] +* @returns {bigint} +*/ +export function toTokenAmount(integer, scale) { + const ret = wasm.toTokenAmount(integer, isLikeNone(scale) ? 0xFFFFFF : scale); + return takeObject(ret); +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** +*/ +export const SwapError = Object.freeze({ NotAdmin:0,"0":"NotAdmin",NotFeeReceiver:1,"1":"NotFeeReceiver",PoolAlreadyExist:2,"2":"PoolAlreadyExist",PoolNotFound:3,"3":"PoolNotFound",TickAlreadyExist:4,"4":"TickAlreadyExist",InvalidTickIndexOrTickSpacing:5,"5":"InvalidTickIndexOrTickSpacing",PositionNotFound:6,"6":"PositionNotFound",TickNotFound:7,"7":"TickNotFound",FeeTierNotFound:8,"8":"FeeTierNotFound",PoolKeyNotFound:9,"9":"PoolKeyNotFound",AmountIsZero:10,"10":"AmountIsZero",WrongLimit:11,"11":"WrongLimit",PriceLimitReached:12,"12":"PriceLimitReached",NoGainSwap:13,"13":"NoGainSwap",InvalidTickSpacing:14,"14":"InvalidTickSpacing",FeeTierAlreadyExist:15,"15":"FeeTierAlreadyExist",PoolKeyAlreadyExist:16,"16":"PoolKeyAlreadyExist",UnauthorizedFeeReceiver:17,"17":"UnauthorizedFeeReceiver",ZeroLiquidity:18,"18":"ZeroLiquidity",TransferError:19,"19":"TransferError",TokensAreSame:20,"20":"TokensAreSame",AmountUnderMinimumAmountOut:21,"21":"AmountUnderMinimumAmountOut",InvalidFee:22,"22":"InvalidFee",NotEmptyTickDeinitialization:23,"23":"NotEmptyTickDeinitialization",InvalidInitTick:24,"24":"InvalidInitTick",InvalidInitSqrtPrice:25,"25":"InvalidInitSqrtPrice",TickLimitReached:26,"26":"TickLimitReached",NoRouteFound:27,"27":"NoRouteFound",MaxTicksCrossed:28,"28":"MaxTicksCrossed",StateOutdated:29,"29":"StateOutdated",InsufficientLiquidity:30,"30":"InsufficientLiquidity", }); + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_bigint_from_u128 = function(arg0, arg1) { + const ret = BigInt.asUintN(64, arg0) << BigInt(64) | BigInt.asUintN(64, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_number_new = function(arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_bigint_from_u64 = function(arg0) { + const ret = BigInt.asUintN(64, arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_BigInt_42b692c18e1ac6d6 = function(arg0) { + const ret = BigInt(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_get = function(arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbg_parse_66d1801634e099ac = function() { return handleError(function (arg0, arg1) { + const ret = JSON.parse(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_stringify_8887fe74e1c50d81 = function() { return handleError(function (arg0) { + const ret = JSON.stringify(getObject(arg0)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('oraiswap_v3_wasm_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c96a107c2540151a4e0243b79886fe1f7e75f5c6 GIT binary patch literal 224361 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 A>;M1& literal 0 HcmV?d00001 diff --git a/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm.d.ts b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm.d.ts new file mode 100644 index 000000000..75ff0fce6 --- /dev/null +++ b/src/pages/Pool-V3/packages/wasm/oraiswap_v3_wasm_bg.wasm.d.ts @@ -0,0 +1,71 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function computeSwapStep(a: number, b: number, c: number, d: number, e: number, f: number, g: number): void; +export function getDeltaX(a: number, b: number, c: number, d: number, e: number): void; +export function getDeltaY(a: number, b: number, c: number, d: number, e: number): void; +export function getNextSqrtPriceFromInput(a: number, b: number, c: number, d: number, e: number): void; +export function getNextSqrtPriceFromOutput(a: number, b: number, c: number, d: number, e: number): void; +export function getNextSqrtPriceXUp(a: number, b: number, c: number, d: number, e: number): void; +export function getNextSqrtPriceYDown(a: number, b: number, c: number, d: number, e: number): void; +export function calculateAmountDelta(a: number, b: number, c: number, d: number, e: number, f: number, g: number): void; +export function isEnoughAmountToChangePrice(a: number, b: number, c: number, d: number, e: number, f: number, g: number): void; +export function calculateMaxLiquidityPerTick(a: number): number; +export function checkTicks(a: number, b: number, c: number, d: number): void; +export function checkTick(a: number, b: number, c: number): void; +export function calculateMinAmountOut(a: number, b: number): number; +export function tickToPositionJs(a: number, b: number, c: number): void; +export function positionToTick(a: number, b: number, c: number): number; +export function getGlobalMaxSqrtPrice(): number; +export function getGlobalMinSqrtPrice(): number; +export function getTickSearchRange(): number; +export function getMaxChunk(a: number): number; +export function getChunkSize(): number; +export function getMaxTickCross(): number; +export function getMaxTickmapQuerySize(): number; +export function getLiquidityTicksLimit(): number; +export function getMaxPoolKeysReturned(): number; +export function getMaxPoolPairsReturned(): number; +export function calculateFee(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number, j: number, k: number, l: number, m: number): void; +export function isTokenX(a: number, b: number, c: number, d: number, e: number): void; +export function checkTickToSqrtPriceRelationship(a: number, b: number, c: number, d: number): void; +export function alignTickToSpacing(a: number, b: number): number; +export function getTickAtSqrtPrice(a: number, b: number, c: number): void; +export function getLiquidityByX(a: number, b: number, c: number, d: number, e: number, f: number): void; +export function getLiquidityByY(a: number, b: number, c: number, d: number, e: number, f: number): void; +export function newFeeTier(a: number, b: number, c: number): void; +export function newPoolKey(a: number, b: number, c: number, d: number, e: number, f: number): void; +export function simulateSwap(a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number): void; +export function getFeeGrowthScale(): number; +export function getFeeGrowthDenominator(): number; +export function toFeeGrowth(a: number, b: number): number; +export function getFixedPointScale(): number; +export function getFixedPointDenominator(): number; +export function toFixedPoint(a: number, b: number): number; +export function getLiquidityScale(): number; +export function getLiquidityDenominator(): number; +export function toLiquidity(a: number, b: number): number; +export function getPercentageDenominator(): number; +export function toPercentage(a: number, b: number): number; +export function getPriceScale(): number; +export function getPriceDenominator(): number; +export function toPrice(a: number, b: number): number; +export function toSecondsPerLiquidity(a: number, b: number): number; +export function toSqrtPrice(a: number, b: number): number; +export function calculateSqrtPrice(a: number, b: number): void; +export function getMaxTick(a: number): number; +export function getMinTick(a: number): number; +export function getMaxSqrtPrice(a: number): number; +export function getMinSqrtPrice(a: number): number; +export function getTokenAmountScale(): number; +export function getTokenAmountDenominator(): number; +export function toTokenAmount(a: number, b: number): number; +export function getSecondsPerLiquidityDenominator(): number; +export function getSqrtPriceDenominator(): number; +export function getPercentageScale(): number; +export function getSecondsPerLiquidityScale(): number; +export function getSqrtPriceScale(): number; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_exn_store(a: number): void; diff --git a/src/pages/Pool-V3/packages/wasm/package.json b/src/pages/Pool-V3/packages/wasm/package.json new file mode 100644 index 000000000..dd0342782 --- /dev/null +++ b/src/pages/Pool-V3/packages/wasm/package.json @@ -0,0 +1,24 @@ +{ + "name": "oraiswap-v3-wasm", + "type": "module", + "collaborators": [ + "Oraichain Labs" + ], + "version": "0.1.0", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/oraichain/oraiswap-v3.git" + }, + "files": [ + "oraiswap_v3_wasm_bg.wasm", + "oraiswap_v3_wasm.js", + "oraiswap_v3_wasm.d.ts" + ], + "main": "oraiswap_v3_wasm.js", + "homepage": "https://orai.io", + "types": "oraiswap_v3_wasm.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cab311ad3..a6924ed48 100644 --- a/yarn.lock +++ b/yarn.lock @@ -78,11 +78,24 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== + dependencies: + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.24.8": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.9.tgz#53eee4e68f1c1d0282aa0eb05ddb02d033fc43a0" + integrity sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng== + "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.23.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": version "7.23.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" @@ -123,6 +136,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.24.8": + version "7.24.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.10.tgz#a4ab681ec2a78bbb9ba22a3941195e28a81d8e76" + integrity sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg== + dependencies: + "@babel/types" "^7.24.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -148,6 +171,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz#b607c3161cd9d1744977d4f97139572fe778c271" + integrity sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw== + dependencies: + "@babel/compat-data" "^7.24.8" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6", "@babel/helper-create-class-features-plugin@^7.23.7": version "7.23.7" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" @@ -188,6 +222,13 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" @@ -196,6 +237,14 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -203,6 +252,21 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-import-to-platform-api@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-import-to-platform-api/-/helper-import-to-platform-api-7.24.7.tgz#aaeff4a7469c47125591cf9a7cd4598285986f09" + integrity sha512-xu7I2Ht+tmabit+HR/BJi4i7VYoc/BvurnRloFdFVnRpdO91pAyOAEHE3+gLXCJf6h7k/bUUB1bjOkLhlui3Og== + dependencies: + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" @@ -217,6 +281,14 @@ dependencies: "@babel/types" "^7.22.15" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" @@ -240,6 +312,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" @@ -279,21 +356,43 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + "@babel/helper-string-parser@^7.23.4": version "7.23.4" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" @@ -321,6 +420,16 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.6": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" @@ -331,6 +440,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== +"@babel/parser@^7.24.7", "@babel/parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.8.tgz#58a4dbbcad7eb1d48930524a3fd93d93e9084c6f" + integrity sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" @@ -372,6 +486,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-decorators" "^7.23.3" +"@babel/plugin-proposal-import-wasm-source@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-import-wasm-source/-/plugin-proposal-import-wasm-source-7.24.7.tgz#08fb72f3c556350279adcfa6b0656e980be69f92" + integrity sha512-YMf82SqUBEl4y8m/NdrmWZx2mwKYM4DAq+wUEYdF0sj9pmDu6OBBjv5kTUcSoAFxBwluh37Xvwu78GVeNPveHA== + dependencies: + "@babel/helper-import-to-platform-api" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-import-source" "^7.24.7" + "@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" @@ -497,6 +620,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-import-source@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-source/-/plugin-syntax-import-source-7.24.7.tgz#f388183e850aa764d6ea0cb9e4657b590931058b" + integrity sha512-9xUADbo/oe7vcqx6h9Jn9dCvDqIQvqDhYe+Y/KJWExVjtbU6XbjRyR7iRrRhPVKbpdsek5TwL1wapoAt9njcaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" @@ -1187,6 +1317,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + "@babel/traverse@^7.23.7", "@babel/traverse@^7.7.2": version "7.23.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" @@ -1203,6 +1342,22 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.8.tgz#6c14ed5232b7549df3371d820fbd9abfcd7dfab7" + integrity sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.8" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.8" + "@babel/types" "^7.24.8" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.23.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" @@ -1212,6 +1367,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.24.9": + version "7.24.9" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.9.tgz#228ce953d7b0d16646e755acf204f4cf3d08cc73" + integrity sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -2763,6 +2927,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -2773,6 +2946,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.3": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" @@ -2794,6 +2972,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -2886,6 +3072,246 @@ dependencies: eslint-scope "5.1.1" +"@nivo/annotations@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/annotations/-/annotations-0.86.0.tgz#cdffbe6a76465017649d0f9fbfb503cfee9e3ed8" + integrity sha512-7D5h2FzjDhAMzN9siLXSGoy1+7ZcKFu6nSoqrc4q8e1somoIw91czsGq7lowG1g4BUoLC1ZCPNRpi7pzb13JCg== + dependencies: + "@nivo/colors" "0.86.0" + "@nivo/core" "0.86.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/prop-types" "^15.7.2" + lodash "^4.17.21" + prop-types "^15.7.2" + +"@nivo/annotations@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/annotations/-/annotations-0.87.0.tgz#e0d125e56b0bd8a536fedc80f125dfb807349856" + integrity sha512-4Xk/soEmi706iOKszjX1EcGLBNIvhMifCYXOuLIFlMAXqhw1x2YS7PxickVSskdSzJCwJX4NgQ/R/9u6nxc5OA== + dependencies: + "@nivo/colors" "0.87.0" + "@nivo/core" "0.87.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + lodash "^4.17.21" + +"@nivo/axes@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/axes/-/axes-0.86.0.tgz#20d6af71201e96a7d2e319cb0e71051a83922b6e" + integrity sha512-puIjpx9GysC4Aey15CPkXrUkLY2Tr7NqP8SCYK6W2MlCjaitkpreD392TCTog1X3LTi39snLsXPl5W9cBW+V2w== + dependencies: + "@nivo/core" "0.86.0" + "@nivo/scales" "0.86.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/d3-format" "^1.4.1" + "@types/d3-time-format" "^2.3.1" + "@types/prop-types" "^15.7.2" + d3-format "^1.4.4" + d3-time-format "^3.0.0" + prop-types "^15.7.2" + +"@nivo/axes@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/axes/-/axes-0.87.0.tgz#939512da23ba53e35e41a6afff98e81d3f440d08" + integrity sha512-zCRBfiRKJi+xOxwxH5Pxq/8+yv3fAYDl4a1F2Ssnp5gMIobwzVsdearvsm5B04e9bfy3ZXTL7KgbkEkSAwu6SA== + dependencies: + "@nivo/core" "0.87.0" + "@nivo/scales" "0.87.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/d3-format" "^1.4.1" + "@types/d3-time-format" "^2.3.1" + d3-format "^1.4.4" + d3-time-format "^3.0.0" + +"@nivo/bar@^0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/bar/-/bar-0.87.0.tgz#c5342fa1ab6a43d0a8db6bffb43a758902017744" + integrity sha512-r/MEVCNAHKfmsy1Fb+JztVczOhIEtAx4VFs2XUbn9YpEDgxydavUJyfoy5/nGq6h5jG1/t47cfB4nZle7c0fyQ== + dependencies: + "@nivo/annotations" "0.87.0" + "@nivo/axes" "0.87.0" + "@nivo/colors" "0.87.0" + "@nivo/core" "0.87.0" + "@nivo/legends" "0.87.0" + "@nivo/scales" "0.87.0" + "@nivo/tooltip" "0.87.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/d3-scale" "^4.0.8" + "@types/d3-shape" "^3.1.6" + d3-scale "^4.0.2" + d3-shape "^3.2.0" + lodash "^4.17.21" + +"@nivo/colors@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/colors/-/colors-0.86.0.tgz#6acb6db19c3d9c3fcf7c83dd8af7733286097cee" + integrity sha512-qsUlpFe4ipGEciQMnicvxL0PeOGspQFfzqJ+lpU5eUeP/C9zLUKGiRRefXRNZMHtY/V1arqFa1P9TD8IXwXF/w== + dependencies: + "@nivo/core" "0.86.0" + "@types/d3-color" "^3.0.0" + "@types/d3-scale" "^4.0.8" + "@types/d3-scale-chromatic" "^3.0.0" + "@types/prop-types" "^15.7.2" + d3-color "^3.1.0" + d3-scale "^4.0.2" + d3-scale-chromatic "^3.0.0" + lodash "^4.17.21" + prop-types "^15.7.2" + +"@nivo/colors@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/colors/-/colors-0.87.0.tgz#a9e64ea0fac86b168f091b82d8375ff379a4100b" + integrity sha512-S4pZzRGKK23t8XAjQMhML6wwsfKO9nH03xuyN4SvCodNA/Dmdys9xV+9Dg/VILTzvzsBTBGTX0dFBg65WoKfVg== + dependencies: + "@nivo/core" "0.87.0" + "@types/d3-color" "^3.0.0" + "@types/d3-scale" "^4.0.8" + "@types/d3-scale-chromatic" "^3.0.0" + "@types/prop-types" "^15.7.2" + d3-color "^3.1.0" + d3-scale "^4.0.2" + d3-scale-chromatic "^3.0.0" + lodash "^4.17.21" + prop-types "^15.7.2" + +"@nivo/core@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/core/-/core-0.86.0.tgz#aeb05891037fab75815766a7436730614baa7963" + integrity sha512-0laA4BYXbDO85wOnWmzM7iv78wCjTF9tt2kEkRIXfHS3sHWCvasL2p+BJSO9/BJNHSgaHoseTdLX78Kg+ofl0Q== + dependencies: + "@nivo/recompose" "0.86.0" + "@nivo/tooltip" "0.86.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/d3-shape" "^2.0.0" + d3-color "^3.1.0" + d3-format "^1.4.4" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-scale-chromatic "^3.0.0" + d3-shape "^1.3.5" + d3-time-format "^3.0.0" + lodash "^4.17.21" + prop-types "^15.7.2" + +"@nivo/core@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/core/-/core-0.87.0.tgz#8ae4a5e46dbb6ab1fdb248b5b3a123a8d34d4bd8" + integrity sha512-yEQWJn7QjWnbmCZccBCo4dligNyNyz3kgyV9vEtcaB1iGeKhg55RJEAlCOul+IDgSCSPFci2SxTmipE6LZEZCg== + dependencies: + "@nivo/tooltip" "0.87.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + "@types/d3-shape" "^3.1.6" + d3-color "^3.1.0" + d3-format "^1.4.4" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-scale-chromatic "^3.0.0" + d3-shape "^3.2.0" + d3-time-format "^3.0.0" + lodash "^4.17.21" + prop-types "^15.7.2" + +"@nivo/legends@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/legends/-/legends-0.86.0.tgz#a3e84c5973b105fdbca21fa7186ef8ace8f02e0f" + integrity sha512-J80tUFh3OZFz+bQ7BdiUtXbWzfQlMsKOlpsn5Ys9g8r/y8bhBagmMaHfq53SYJ7ottHyibgiOvtxfWR6OGA57g== + dependencies: + "@nivo/colors" "0.86.0" + "@nivo/core" "0.86.0" + "@types/d3-scale" "^4.0.8" + "@types/prop-types" "^15.7.2" + d3-scale "^4.0.2" + prop-types "^15.7.2" + +"@nivo/legends@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/legends/-/legends-0.87.0.tgz#3a45c5203f987b9ba3710133c431f4809432b955" + integrity sha512-bVJCeqEmK4qHrxNaPU/+hXUd/yaKlcQ0yrsR18ewoknVX+pgvbe/+tRKJ+835JXlvRijYIuqwK1sUJQIxyB7oA== + dependencies: + "@nivo/colors" "0.87.0" + "@nivo/core" "0.87.0" + "@types/d3-scale" "^4.0.8" + d3-scale "^4.0.2" + +"@nivo/line@^0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/line/-/line-0.86.0.tgz#b62f503667d9331d717c899e9e74dd5f154d5f52" + integrity sha512-y6tmhuXo2gU5AKSMsbGgHzrwRNkKaoxetmVOat25Be/e7eIDyDYJTfFDJJ2U9q1y/fcOmYUEUEV5jAIG4d2abA== + dependencies: + "@nivo/annotations" "0.86.0" + "@nivo/axes" "0.86.0" + "@nivo/colors" "0.86.0" + "@nivo/core" "0.86.0" + "@nivo/legends" "0.86.0" + "@nivo/scales" "0.86.0" + "@nivo/tooltip" "0.86.0" + "@nivo/voronoi" "0.86.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + d3-shape "^1.3.5" + prop-types "^15.7.2" + +"@nivo/recompose@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/recompose/-/recompose-0.86.0.tgz#b622e6f56d929bbb120d1671c2b7e089d3c44004" + integrity sha512-fS0FKcsAK6auMc1oFszSpPw+uaXSQcuc1bDOjcXtb2FwidnG3hzQkLdnK42ksi/bUZyScpHu8+c0Df+CmDNXrw== + dependencies: + "@types/prop-types" "^15.7.2" + "@types/react-lifecycles-compat" "^3.0.1" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.4" + +"@nivo/scales@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/scales/-/scales-0.86.0.tgz#0ec7ddf314469e7c48f4ee0d4c6cd952661ce78d" + integrity sha512-zw+/BVUo7PFivZVoSAgsocQZ4BtEzjNAijfZT03zVs1i+TJ1ViMtoHafAXkDtIE7+ie0IqeVVhjjTv3RfsFxrQ== + dependencies: + "@types/d3-scale" "^4.0.8" + "@types/d3-time" "^1.1.1" + "@types/d3-time-format" "^3.0.0" + d3-scale "^4.0.2" + d3-time "^1.0.11" + d3-time-format "^3.0.0" + lodash "^4.17.21" + +"@nivo/scales@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/scales/-/scales-0.87.0.tgz#03fa56f4ebced83eaca1c0a430870224146988fa" + integrity sha512-IHdY9w2em/xpWurcbhUR3cUA1dgbY06rU8gmA/skFCwf3C4Da3Rqwr0XqvxmkDC+EdT/iFljMbLst7VYiCnSdw== + dependencies: + "@types/d3-scale" "^4.0.8" + "@types/d3-time" "^1.1.1" + "@types/d3-time-format" "^3.0.0" + d3-scale "^4.0.2" + d3-time "^1.0.11" + d3-time-format "^3.0.0" + lodash "^4.17.21" + +"@nivo/tooltip@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/tooltip/-/tooltip-0.86.0.tgz#66124d935a10bc931dce1ababc24360d4646dcc5" + integrity sha512-esaON+SltO+8jhyvhiInTrhswms9zCO9e5xIycHmhPbgijV+WdFp4WDtT9l6Lb6kSS00AYzHq7P0p6lyMg4v9g== + dependencies: + "@nivo/core" "0.86.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + +"@nivo/tooltip@0.87.0": + version "0.87.0" + resolved "https://registry.yarnpkg.com/@nivo/tooltip/-/tooltip-0.87.0.tgz#5c5898371cc4f291fbb5865d68f42dd84beead35" + integrity sha512-nZJWyRIt/45V/JBdJ9ksmNm1LFfj59G1Dy9wB63Icf2YwyBT+J+zCzOGXaY7gxCxgF1mnSL3dC7fttcEdXyN/g== + dependencies: + "@nivo/core" "0.87.0" + "@react-spring/web" "9.4.5 || ^9.7.2" + +"@nivo/voronoi@0.86.0": + version "0.86.0" + resolved "https://registry.yarnpkg.com/@nivo/voronoi/-/voronoi-0.86.0.tgz#3060bc6a1e18bab2b46dceb82e13e4790f68872b" + integrity sha512-BPjHpBu7KQXndNePNHWv37AXD1VwIsCZLhyUGuWPUkNidUMG8il0UgK2ej46OKbOeyQEhWjtMEtUG3M1uQk3Ng== + dependencies: + "@nivo/core" "0.86.0" + "@types/d3-delaunay" "^5.3.0" + "@types/d3-scale" "^4.0.8" + d3-delaunay "^5.3.0" + d3-scale "^4.0.2" + "@noble/curves@1.1.0", "@noble/curves@~1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" @@ -3256,6 +3682,51 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@react-spring/animated@~9.7.4": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.4.tgz#c712b2d3dc9312ef41aa8886818b539151bda062" + integrity sha512-7As+8Pty2QlemJ9O5ecsuPKjmO0NKvmVkRR1n6mEotFgWar8FKuQt2xgxz3RTgxcccghpx1YdS1FCdElQNexmQ== + dependencies: + "@react-spring/shared" "~9.7.4" + "@react-spring/types" "~9.7.4" + +"@react-spring/core@~9.7.4": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.4.tgz#0eaa0b5da3d18036d87a571f23079819d45a9f46" + integrity sha512-GzjA44niEJBFUe9jN3zubRDDDP2E4tBlhNlSIkTChiNf9p4ZQlgXBg50qbXfSXHQPHak/ExYxwhipKVsQ/sUTw== + dependencies: + "@react-spring/animated" "~9.7.4" + "@react-spring/shared" "~9.7.4" + "@react-spring/types" "~9.7.4" + +"@react-spring/rafz@~9.7.4": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.4.tgz#d53aa45a8cb116b81b27ba29e0cc15470ccfd449" + integrity sha512-mqDI6rW0Ca8IdryOMiXRhMtVGiEGLIO89vIOyFQXRIwwIMX30HLya24g9z4olDvFyeDW3+kibiKwtZnA4xhldA== + +"@react-spring/shared@~9.7.4": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.4.tgz#8ac57505072c2aee33d77c47c4269347061a3377" + integrity sha512-bEPI7cQp94dOtCFSEYpxvLxj0+xQfB5r9Ru1h8OMycsIq7zFZon1G0sHrBLaLQIWeMCllc4tVDYRTLIRv70C8w== + dependencies: + "@react-spring/rafz" "~9.7.4" + "@react-spring/types" "~9.7.4" + +"@react-spring/types@~9.7.4": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.4.tgz#c849a7f062b5163d078e5e75f28c8f6acf91792e" + integrity sha512-iQVztO09ZVfsletMiY+DpT/JRiBntdsdJ4uqk3UJFhrhS8mIC9ZOZbmfGSRs/kdbNPQkVyzucceDicQ/3Mlj9g== + +"@react-spring/web@9.4.5 || ^9.7.2": + version "9.7.4" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.4.tgz#0086ab5dcf17e6a8f3d7e7f8041ccb4cc2fa10dc" + integrity sha512-UMvCZp7I5HCVIleSa4BwbNxynqvj+mJjG2m20VO2yPoi2pnCYANy58flvz9v/YcXTAvsmL655FV3pm5fbr6akA== + dependencies: + "@react-spring/animated" "~9.7.4" + "@react-spring/core" "~9.7.4" + "@react-spring/shared" "~9.7.4" + "@react-spring/types" "~9.7.4" + "@reduxjs/toolkit@^1.9.3": version "1.9.7" resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.7.tgz#7fc07c0b0ebec52043f8cb43510cf346405f78a6" @@ -3919,6 +4390,77 @@ dependencies: "@types/node" "*" +"@types/d3-color@^3.0.0": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-delaunay@^5.3.0": + version "5.3.4" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-5.3.4.tgz#6440a78e48bbfc3652a2ec007a710e046c421a10" + integrity sha512-GEQuDXVKQvHulQ+ecKyCubOmVjXrifAj7VR26rWVAER/IbWemaT/Tmo84ESiTtoDghg5ILdMZH7pYXQEt/Vu9A== + +"@types/d3-format@^1.4.1": + version "1.4.5" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-1.4.5.tgz#6392303c2ca3c287c3a1a2046455cd0a0bd50bbe" + integrity sha512-mLxrC1MSWupOSncXN/HOlWUAAIffAEBaI4+PKy2uMPsKe4FNZlk7qrbTjmzJXITQQqBHivaks4Td18azgqnotA== + +"@types/d3-path@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" + integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + +"@types/d3-path@^2": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.4.tgz#6b2893c23ec01788f79f7a6ec39eaaf9a6732af4" + integrity sha512-jjZVLBjEX4q6xneKMmv62UocaFJFOTQSb/1aTzs3m3ICTOFoVaqGBHpNLm/4dVi0/FTltfBKgmOK1ECj3/gGjA== + +"@types/d3-scale-chromatic@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" + integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + +"@types/d3-scale@^4.0.8": + version "4.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" + integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== + dependencies: + "@types/d3-time" "*" + +"@types/d3-shape@^2.0.0": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.7.tgz#7c3bd6a9c758b54ba495cab0575cb18359251123" + integrity sha512-HedHlfGHdwzKqX9+PiQVXZrdmGlwo7naoefJP7kCNk4Y7qcpQt1tUaoRa6qn0kbTdlaIHGO7111qLtb/6J8uuw== + dependencies: + "@types/d3-path" "^2" + +"@types/d3-shape@^3.1.6": + version "3.1.6" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72" + integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@^2.3.1": + version "2.3.4" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-2.3.4.tgz#544af5184df8b3fc4d9b42b14058789acee2905e" + integrity sha512-xdDXbpVO74EvadI3UDxjxTdR6QIxm1FKzEA/+F8tL4GWWUg/hgvBqf6chql64U5A9ZUGWo7pEu4eNlyLwbKdhg== + +"@types/d3-time-format@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-3.0.4.tgz#f972bdd7be1048184577cf235a44721a78c6bb4b" + integrity sha512-or9DiDnYI1h38J9hxKEsw513+KVuFbEVhl7qdxcaudoiqWWepapUen+2vAriFGexr6W5+P4l9+HJrB39GG+oRg== + +"@types/d3-time@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" + integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== + +"@types/d3-time@^1.1.1": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-1.1.4.tgz#20da4b75c537a940e7319b75717c67a2e499515a" + integrity sha512-JIvy2HjRInE+TXOmIGN5LCmeO0hkFZx5f9FZ7kiN+D+YTcc8pptsiLiuHsvwxwC7VVKmJ2ExHUgNlAiV7vQM9g== + "@types/duplexify@^3.6.0": version "3.6.4" resolved "https://registry.yarnpkg.com/@types/duplexify/-/duplexify-3.6.4.tgz#aa7e916c33fcc05be8769546fd0441d9b368613e" @@ -4194,6 +4736,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.11.tgz#2596fb352ee96a1379c657734d4b913a613ad563" integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== +"@types/prop-types@^15.7.2": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== + "@types/q@^1.5.1": version "1.5.8" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837" @@ -4216,6 +4763,13 @@ dependencies: "@types/react" "*" +"@types/react-lifecycles-compat@^3.0.1": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#87eb56ce6cce9e9db4557825ab559d90f72995dc" + integrity sha512-1CM48Y9ztL5S4wjt7DK2izrkgPp/Ql0zCJu/vHzhgl7J+BD4UbSGjHN1M2TlePms472JvOazUtAO1/G3oFZqIQ== + dependencies: + "@types/react" "*" + "@types/react-modal@^3.13.1": version "3.16.3" resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.16.3.tgz#250f32c07f1de28e2bcf9c3e84b56adaa6897013" @@ -6013,6 +6567,16 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4 node-releases "^2.0.14" update-browserslist-db "^1.0.13" +browserslist@^4.23.1: + version "4.23.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.2.tgz#244fe803641f1c19c28c48c4b6ec9736eb3d32ed" + integrity sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA== + dependencies: + caniuse-lite "^1.0.30001640" + electron-to-chromium "^1.4.820" + node-releases "^2.0.14" + update-browserslist-db "^1.1.0" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -6214,6 +6778,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz#fb4f1359c77f6af942510493672e1ec7ec80230c" integrity sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg== +caniuse-lite@^1.0.30001640: + version "1.0.30001643" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz#9c004caef315de9452ab970c3da71085f8241dbd" + integrity sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg== + capital-case@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" @@ -7184,6 +7753,125 @@ csv-parse@^5.0.4: resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.3.tgz#0261050761ee46cd0e46421854bf9bf4de1317bf" integrity sha512-v0KW6C0qlZzoGjk6u5tLmVfyZxNgPGXZsWTXshpAgKVGmGXzaVWGdlCFxNx5iuzcXT/oJN1HHM9DZKwtAtYa+A== +d3-array@2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3": + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-color@1 - 3", d3-color@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-delaunay@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-5.3.0.tgz#b47f05c38f854a4e7b3cea80e0bb12e57398772d" + integrity sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w== + dependencies: + delaunator "4" + +"d3-format@1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-format@^1.4.4: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-scale-chromatic@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-shape@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +"d3-time-format@2 - 4": + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +d3-time-format@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6" + integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag== + dependencies: + d3-time "1 - 2" + +"d3-time@1 - 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3": + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +d3-time@^1.0.11: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" @@ -7347,6 +8035,11 @@ degenerator@^3.0.2: esprima "^4.0.0" vm2 "^3.9.17" +delaunator@4: + version "4.0.1" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957" + integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag== + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -7689,6 +8382,11 @@ electron-to-chromium@^1.4.601: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz#a6481e0703f8df1e6821063fb43c9b818a7a2ef4" integrity sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g== +electron-to-chromium@^1.4.820: + version "1.5.1" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.1.tgz#24640bd4dcfaccb6d82bb4c3f4c7311503241581" + integrity sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w== + elliptic@6.5.4, elliptic@^6.4.1, elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -8065,6 +8763,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== + escape-goat@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" @@ -10087,6 +10790,16 @@ internal-slot@^1.0.5: hasown "^2.0.0" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== + interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" @@ -12970,6 +13683,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -14122,7 +14840,7 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-lifecycles-compat@^3.0.0: +react-lifecycles-compat@^3.0.0, react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -15531,7 +16249,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15549,15 +16267,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -15637,7 +16346,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -15658,13 +16367,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -16604,6 +17306,14 @@ update-browserslist-db@^1.0.13: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== + dependencies: + escalade "^3.1.2" + picocolors "^1.0.1" + update-notifier-cjs@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/update-notifier-cjs/-/update-notifier-cjs-5.1.6.tgz#6e3aff745d1551b55bb0a0a5939b7e636d95877d" @@ -17317,7 +18027,7 @@ workbox-window@6.6.1: "@types/trusted-types" "^2.0.2" workbox-core "6.6.1" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17344,15 +18054,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"