From ca3214216de541c139e95a38cf3d3044999a6859 Mon Sep 17 00:00:00 2001 From: Mario Reder Date: Thu, 21 Nov 2024 14:22:32 +0100 Subject: [PATCH] sdk v2 --- app/components/Assets.tsx | 1 + app/components/ClosePosition.tsx | 158 +++++++---------- app/components/CreateOrder.tsx | 276 +++++++++++------------------- app/components/Positions.tsx | 6 +- app/components/StopOrder.tsx | 255 +++++++++++---------------- app/components/SymbolHeader.tsx | 12 +- app/components/TokenInput.tsx | 2 +- app/components/TpSlOrder.tsx | 4 +- app/components/UpdatePosition.tsx | 9 +- app/providers/OrderlyProvider.tsx | 4 +- app/utils/api.ts | 5 +- package.json | 15 +- yarn.lock | 208 ++++++++++++++-------- 13 files changed, 426 insertions(+), 529 deletions(-) diff --git a/app/components/Assets.tsx b/app/components/Assets.tsx index ca28b88..aa65a20 100644 --- a/app/components/Assets.tsx +++ b/app/components/Assets.tsx @@ -37,6 +37,7 @@ export const Assets: FC = () => { }); const balance = useMemo( () => (status >= AccountStatusEnum.Connected ? deposit.balance : undefined), + // eslint-disable-next-line react-hooks/exhaustive-deps [status, deposit, account.chainId] ); const { withdraw, availableWithdraw } = useWithdraw(); diff --git a/app/components/ClosePosition.tsx b/app/components/ClosePosition.tsx index 970a23b..ab68136 100644 --- a/app/components/ClosePosition.tsx +++ b/app/components/ClosePosition.tsx @@ -1,45 +1,51 @@ import { useOrderEntry, useSymbolsInfo } from '@orderly.network/hooks'; -import { API, OrderEntity, OrderSide, OrderType } from '@orderly.network/types'; +import { API, OrderlyOrder, OrderSide, OrderType } from '@orderly.network/types'; import { Slider } from '@radix-ui/themes'; import { useNotifications } from '@web3-onboard/react'; import { FixedNumber } from 'ethers'; -import { Dispatch, FC, SetStateAction, useState } from 'react'; -import { Controller, SubmitHandler, useForm } from 'react-hook-form'; +import { Dispatch, FC, SetStateAction, useCallback, useState } from 'react'; import { Spinner, TokenInput } from '.'; import { getDecimalsFromTick } from '~/utils'; import { renderFormError } from '~/utils/form'; -type Inputs = { - direction: OrderSide; - type: OrderType; - quantity: string | number; -}; - export const ClosePosition: FC<{ position: API.PositionExt; - refresh: import('swr/_internal').KeyedMutator; setOpen: Dispatch>; -}> = ({ position, refresh, setOpen }) => { +}> = ({ position, setOpen }) => { const [loading, setLoading] = useState(false); const symbolsInfo = useSymbolsInfo(); - const { register, handleSubmit, control } = useForm({ - defaultValues: { - direction: position.position_qty > 0 ? OrderSide.SELL : OrderSide.BUY, - type: OrderType.MARKET, - quantity: Math.abs(position.position_qty) + const { + submit, + setValue, + formattedOrder, + metaState: { dirty, errors, submitted } + } = useOrderEntry(position.symbol, { + initialOrder: { + side: position.position_qty > 0 ? OrderSide.SELL : OrderSide.BUY, + order_type: OrderType.MARKET, + order_quantity: String(Math.abs(position.position_qty)), + reduce_only: true } }); - const { onSubmit, helper } = useOrderEntry( - { - symbol: position.symbol, - side: OrderSide.BUY, - order_type: OrderType.MARKET + const hasError = useCallback( + ( + key: keyof OrderlyOrder + ): + | { + type: string; + message: string; + } + | undefined => { + if (!dirty[key] && !submitted) { + return; + } + return errors?.[key]; }, - { watchOrderbook: true } + [errors, dirty, submitted] ); const [_0, customNotification] = useNotifications(); @@ -47,7 +53,7 @@ export const ClosePosition: FC<{ return ; } - const submitForm: SubmitHandler = async (data) => { + const submitForm = async () => { setLoading(true); const { update } = customNotification({ eventCode: 'closePosition', @@ -55,7 +61,7 @@ export const ClosePosition: FC<{ message: 'Closing position...' }); try { - await onSubmit(getInput(data, position.symbol)); + await submit(); update({ eventCode: 'closePositionSuccess', type: 'success', @@ -72,7 +78,6 @@ export const ClosePosition: FC<{ }); } finally { setLoading(false); - refresh(); setOpen(false); } }; @@ -82,62 +87,47 @@ export const ClosePosition: FC<{ const [baseDecimals] = getDecimalsFromTick(symbolInfo); return ( -
+ { + event.preventDefault(); + submitForm(); + }} + >
Partially or fully close your open position at mark price.
- - -
@@ -128,117 +127,74 @@ export const CreateOrder: FC<{
- { + console.log('CHANGE', event.target.value); + setValue('order_type', event.target.value); + }} + > + + + @@ -265,29 +221,3 @@ export const CreateOrder: FC<{ ); }; - -async function getValidationErrors( - data: Inputs, - symbol: string, - validator: ReturnType['helper']['validator'] -): Promise['helper']['validator']>> { - return validator(getInput(data, symbol)); -} - -function getInput(data: Inputs, symbol: string): OrderEntity { - return { - symbol, - side: match(data.direction) - .with('Buy', () => OrderSide.BUY) - .with('Sell', () => OrderSide.SELL) - .exhaustive(), - order_type: match(data.type) - .with('Market', () => OrderType.MARKET) - .with('Limit', () => OrderType.LIMIT) - .with('StopLimit', () => OrderType.STOP_LIMIT) - .exhaustive(), - order_price: data.price, - order_quantity: data.quantity, - trigger_price: data.triggerPrice - }; -} diff --git a/app/components/Positions.tsx b/app/components/Positions.tsx index 24ea167..7944778 100644 --- a/app/components/Positions.tsx +++ b/app/components/Positions.tsx @@ -11,9 +11,7 @@ export const Positions: FC<{ symbol: string; showAll?: boolean }> = ({ symbol, showAll = true }) => { - const [positions, _info, { refresh, isLoading }] = usePositionStream( - showAll ? undefined : symbol - ); + const [positions, _info, { isLoading }] = usePositionStream(showAll ? undefined : symbol); const { state } = useAccount(); if (state.status <= AccountStatusEnum.NotSignedIn) { @@ -64,7 +62,7 @@ export const Positions: FC<{ symbol: string; showAll?: boolean }> = ({ {position.est_liq_price ? usdFormatter.format(position.est_liq_price) : '-'} - + ); diff --git a/app/components/StopOrder.tsx b/app/components/StopOrder.tsx index 035c51f..dae3831 100644 --- a/app/components/StopOrder.tsx +++ b/app/components/StopOrder.tsx @@ -1,56 +1,65 @@ import { useOrderEntry, useSymbolsInfo } from '@orderly.network/hooks'; import { positions } from '@orderly.network/perp'; -import { API, OrderEntity, OrderSide, OrderType } from '@orderly.network/types'; +import { API, OrderlyOrder, OrderSide, OrderType } from '@orderly.network/types'; import { Slider } from '@radix-ui/themes'; import { useNotifications } from '@web3-onboard/react'; import { FixedNumber } from 'ethers'; -import { Dispatch, FC, SetStateAction, useState } from 'react'; -import { Controller, SubmitHandler, useForm } from 'react-hook-form'; -import { P, match } from 'ts-pattern'; +import { Dispatch, FC, SetStateAction, useCallback, useState } from 'react'; +import { match } from 'ts-pattern'; import { Spinner, TokenInput } from '.'; import { getDecimalsFromTick, renderFormError, usdFormatter } from '~/utils'; -type Inputs = { - direction: 'TakeProfit' | 'StopLoss'; - type: OrderType; - trigger_price?: string; - quantity?: string | number; -}; - export const StopOrder: FC<{ position: API.PositionExt; - refresh: import('swr/_internal').KeyedMutator; setOpen: Dispatch>; -}> = ({ position, refresh, setOpen }) => { +}> = ({ position, setOpen }) => { const [loading, setLoading] = useState(false); const symbolsInfo = useSymbolsInfo(); - const { register, handleSubmit, control, watch } = useForm({ - defaultValues: { - direction: 'TakeProfit', - type: OrderType.STOP_MARKET, + const isLong = position.position_qty > 0; + const { + submit, + setValue, + formattedOrder, + metaState: { dirty, errors, submitted } + } = useOrderEntry(position.symbol, { + initialOrder: { + side: isLong ? OrderSide.SELL : OrderSide.BUY, + order_type: OrderType.STOP_MARKET, trigger_price: undefined, - quantity: String(Math.abs(position.position_qty)) + order_quantity: String(Math.abs(position.position_qty)) } }); - const { onSubmit, helper } = useOrderEntry( - { - symbol: position.symbol, - side: OrderSide.BUY, - order_type: OrderType.STOP_MARKET + const hasError = useCallback( + ( + key: keyof OrderlyOrder + ): + | { + type: string; + message: string; + } + | undefined => { + if (!dirty[key] && !submitted) { + return; + } + return errors?.[key]; }, - { watchOrderbook: true } + [errors, dirty, submitted] ); const [_0, customNotification] = useNotifications(); + const isTakeProfit = isLong + ? formattedOrder.side === OrderSide.SELL + : formattedOrder.side === OrderSide.BUY; + if (symbolsInfo.isNil) { return ; } - const submitForm: SubmitHandler = async (data) => { + const submitForm = async () => { setLoading(true); const { update } = customNotification({ eventCode: 'createStopOrder', @@ -58,7 +67,8 @@ export const StopOrder: FC<{ message: 'Creating order...' }); try { - await onSubmit(getInput(data, position)); + console.log(errors); + await submit(); update({ eventCode: 'createStopOrderSuccess', type: 'success', @@ -75,15 +85,14 @@ export const StopOrder: FC<{ }); } finally { setLoading(false); - refresh(); setOpen(false); } }; const estimatedPnl = positions.unrealizedPnL({ - qty: Number(watch('quantity') ?? 0), + qty: Number(formattedOrder.order_quantity ?? 0), openPrice: position.average_open_price, - markPrice: Number(watch('trigger_price') ?? 0) + markPrice: Number(formattedOrder.trigger_price ?? 0) }); const symbolInfo = symbolsInfo[position.symbol](); @@ -91,139 +100,91 @@ export const StopOrder: FC<{ const [baseDecimals, quoteDecimals] = getDecimalsFromTick(symbolInfo); return ( -
+ { + event.preventDefault(); + submitForm(); + }} + >
Create an algorithmic order to (partially) close a position when a specific mark price is reached.
- -
- -
Est. PnL: - {watch('quantity') && watch('trigger_price') + {formattedOrder.order_quantity && formattedOrder.trigger_price ? `${usdFormatter.format(estimatedPnl)} ${quote}` : '-'} @@ -235,31 +196,11 @@ export const StopOrder: FC<{ className="relative py-2 font-size-5 bg-[var(--accent-9)] hover:bg-[var(--accent-10)] border-rd-1 border-0" > {loading && }{' '} - {match(watch('direction')) - .with('TakeProfit', () => 'Take Profit') - .with('StopLoss', () => 'Stop Loss') + {match(isTakeProfit) + .with(true, () => 'Take Profit') + .with(false, () => 'Stop Loss') .exhaustive()} ); }; - -async function getValidationErrors( - data: Inputs, - position: API.PositionExt, - validator: ReturnType['helper']['validator'] -): Promise['helper']['validator']>> { - return validator(getInput(data, position)); -} - -function getInput(data: Inputs, position: API.PositionExt): OrderEntity { - const isLong = position.position_qty > 0; - return { - symbol: position.symbol, - isStopOrder: true, - order_quantity: data.quantity, - trigger_price: data.trigger_price, - side: isLong ? OrderSide.SELL : OrderSide.BUY, - order_type: OrderType.STOP_MARKET - }; -} diff --git a/app/components/SymbolHeader.tsx b/app/components/SymbolHeader.tsx index 9015a62..dcd643a 100644 --- a/app/components/SymbolHeader.tsx +++ b/app/components/SymbolHeader.tsx @@ -17,15 +17,9 @@ export const SymbolHeader: FC<{ } else { let dailyChange: string | undefined; let dailyChangePercentage: string | undefined; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - if ((stream as any)['24h_change'] != null && stream.index_price != null) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - dailyChange = String((stream as any)['24h_change'].toNumber()); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - dailyChangePercentage = (stream as any)['24h_change'] - .div(stream.index_price) - .mul(100) - .toPrecision(4, 2); + if (stream['24h_change'] != null && stream.change != null) { + dailyChange = String(stream['24h_change']); + dailyChangePercentage = ((stream.change ?? 0) * 100).toFixed(2); } content = ( diff --git a/app/components/TokenInput.tsx b/app/components/TokenInput.tsx index 3c1566d..2571ec2 100644 --- a/app/components/TokenInput.tsx +++ b/app/components/TokenInput.tsx @@ -36,7 +36,7 @@ export const TokenInput: FC< const [value, setValue] = useState(outerValue ? String(outerValue) : ''); useEffect(() => { - if (outerValue == null || typeof outerValue === 'string') return; + if (outerValue == null) return; let newValue = filterAllowedCharacters(String(outerValue)); const quantity = getFormattedNumber(newValue, decimals); if (getFormattedNumber(value, decimals) !== quantity) { diff --git a/app/components/TpSlOrder.tsx b/app/components/TpSlOrder.tsx index 2941356..88f1b4f 100644 --- a/app/components/TpSlOrder.tsx +++ b/app/components/TpSlOrder.tsx @@ -18,9 +18,8 @@ type Inputs = { export const TpSlOrder: FC<{ position: API.PositionExt; - refresh: import('swr/_internal').KeyedMutator; setOpen: Dispatch>; -}> = ({ position, refresh, setOpen }) => { +}> = ({ position, setOpen }) => { const [loading, setLoading] = useState(false); const symbolsInfo = useSymbolsInfo(); @@ -83,7 +82,6 @@ export const TpSlOrder: FC<{ }); } finally { setLoading(false); - refresh(); setOpen(false); } }; diff --git a/app/components/UpdatePosition.tsx b/app/components/UpdatePosition.tsx index fc2cfa8..fed4b4f 100644 --- a/app/components/UpdatePosition.tsx +++ b/app/components/UpdatePosition.tsx @@ -10,8 +10,7 @@ import { baseFormatter, usdFormatter } from '~/utils'; export const UpdatePosition: FC<{ position: API.PositionExt; - refresh: import('swr/_internal').KeyedMutator; -}> = ({ position, refresh }) => { +}> = ({ position }) => { const [open, setOpen] = useState(false); const renderPositionValue = (header: string, value: string) => ( @@ -68,13 +67,13 @@ export const UpdatePosition: FC<{ - + - + - + diff --git a/app/providers/OrderlyProvider.tsx b/app/providers/OrderlyProvider.tsx index 5562e11..fa17f5c 100644 --- a/app/providers/OrderlyProvider.tsx +++ b/app/providers/OrderlyProvider.tsx @@ -1,4 +1,4 @@ -import { DefaultEVMAdapterWalletAdapter } from '@orderly.network/default-evm-adapter'; +import { DefaultEVMWalletAdapter } from '@orderly.network/default-evm-adapter'; import { DefaultSolanaWalletAdapter } from '@orderly.network/default-solana-adapter'; import { OrderlyConfigProvider } from '@orderly.network/hooks'; import { EthersProvider } from '@orderly.network/web3-provider-ethers'; @@ -22,7 +22,7 @@ export const OrderlyProvider: FC<{ children: React.ReactNode }> = ({ children }) brokerId={import.meta.env.VITE_BROKER_ID} brokerName={import.meta.env.VITE_BROKER_NAME} walletAdapters={[ - new DefaultEVMAdapterWalletAdapter(new EthersProvider()), + new DefaultEVMWalletAdapter(new EthersProvider()), new DefaultSolanaWalletAdapter() ]} > diff --git a/app/utils/api.ts b/app/utils/api.ts index 45f5b7b..5d10a58 100644 --- a/app/utils/api.ts +++ b/app/utils/api.ts @@ -1,6 +1,9 @@ import { API } from '@orderly.network/types'; -export function getDecimalsFromTick(symbol: API.Symbol): [number, number] { +export function getDecimalsFromTick(symbol?: API.Symbol): [number, number] { + if (symbol == null) { + return [0, 0]; + } let baseDecimals: number = 0; if (symbol.base_tick < 1) { baseDecimals = (symbol.base_tick + '').split('.')[1].length; diff --git a/package.json b/package.json index 3af2dbf..f4d74d5 100644 --- a/package.json +++ b/package.json @@ -23,13 +23,13 @@ "typecheck": "tsc" }, "dependencies": { - "@orderly.network/default-evm-adapter": "^2.0.0", - "@orderly.network/default-solana-adapter": "^2.0.0", - "@orderly.network/hooks": "2.0.0", - "@orderly.network/perp": "4.0.0", - "@orderly.network/trading-view": "2.0.0", - "@orderly.network/types": "2.0.0", - "@orderly.network/web3-provider-ethers": "^2.0.0", + "@orderly.network/default-evm-adapter": "2.0.1-alpha.1", + "@orderly.network/default-solana-adapter": "2.0.1-alpha.1", + "@orderly.network/hooks": "2.0.1-alpha.1", + "@orderly.network/perp": "4.0.1-alpha.1", + "@orderly.network/trading-view": "2.0.1-alpha.1", + "@orderly.network/types": "2.0.1-alpha.1", + "@orderly.network/web3-provider-ethers": "2.0.1-alpha.1", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/themes": "^3.0.1", "@remix-run/node": "^2.13.1", @@ -44,6 +44,7 @@ "@web3-onboard/injected-wallets": "^2.11.2", "@web3-onboard/react": "^2.10.0", "@web3-onboard/walletconnect": "^2.6.1", + "deep-equal": "^2.2.3", "ethers": "^6.11.1", "isbot": "^5.1.2", "lightweight-charts": "^4.1.3", diff --git a/yarn.lock b/yarn.lock index 5d9cf2f..0781c72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2284,41 +2284,41 @@ dependencies: which "^3.0.0" -"@orderly.network/core@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/core/-/core-2.0.0.tgz#b01adec1df20ac3e20881f7f1566518f34186a6b" - integrity sha512-7PQ+XUQc5Bck3SdE6vDQaaXkgy50GjBgntyInqhLp7O+cFbv872zw8zIw+QnN8QkqLzVMZ8NmfrVveeDTijL9g== +"@orderly.network/core@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/core/-/core-2.0.1-alpha.1.tgz#53fc9ee9b9b67e0838e16738bf1269540bdf2103" + integrity sha512-8tXN3KLO02j/7Wj8p59K6taTSx7C6OF8ACEpWPez6uOwZHg0XqRXgjUZkYhLHAFmX18XA4YnMmoilCXXo9xfcA== dependencies: "@enzoferey/ethers-error-parser" "^0.2.3" "@noble/ed25519" "^2.0.0" - "@orderly.network/types" "2.0.0" + "@orderly.network/types" "2.0.1-alpha.1" "@solana/web3.js" "1.95.3" bs58 "^5.0.0" ethers "^6.13.2" eventemitter3 "^5.0.1" lodash.merge "^4.6.2" -"@orderly.network/default-evm-adapter@2.0.0", "@orderly.network/default-evm-adapter@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/default-evm-adapter/-/default-evm-adapter-2.0.0.tgz#5eb6c1621137b8b3290f15ea742a82de1fd6bd09" - integrity sha512-mFlIG/7aREyvWmx8jyl+uWXaBo7kZc1P5UCp1qaPbrTB5HEweG1VNgmZW2oP6Gr/0HBy+a/gSviOinv+GEUnjA== +"@orderly.network/default-evm-adapter@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/default-evm-adapter/-/default-evm-adapter-2.0.1-alpha.1.tgz#e09817388e4769e99c05cf2fbacd662de89122a4" + integrity sha512-VVviVNtlnB0wmGMLEdStTDQzL2SUpzlLIjxjHf4j1txOiMla5pkZohlRAewIbhrsfNu0J2/zftjDpww/XQ6enA== dependencies: "@noble/ed25519" "^2.0.0" - "@orderly.network/core" "2.0.0" - "@orderly.network/types" "2.0.0" + "@orderly.network/core" "2.0.1-alpha.1" + "@orderly.network/types" "2.0.1-alpha.1" bs58 "^5.0.0" -"@orderly.network/default-solana-adapter@2.0.0", "@orderly.network/default-solana-adapter@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/default-solana-adapter/-/default-solana-adapter-2.0.0.tgz#6f915f6a860068af275272695f7bceb44d61a296" - integrity sha512-UevpXDbB4dCnvs050ndEvuCpK8iTJxXSfxzUcqb/LXc92qWZXMmi7TDC2SsWdwKKT1V0CJOpr5+gkTDCO6qoaQ== +"@orderly.network/default-solana-adapter@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/default-solana-adapter/-/default-solana-adapter-2.0.1-alpha.1.tgz#348ce08376d3cf8eb66ffdaea547aa714a226a3e" + integrity sha512-kIZUXVB1zA6rlwKmU+p1vDJXTopD947Z3ky6fv+Y6pvDGNyfwKVM3fW7dbE6F4wqNzf/EjP8vlj6ATLi18QKTA== dependencies: "@coral-xyz/anchor" "0.29.0" "@layerzerolabs/lz-solana-sdk-v2" "2.3.45-oft-rc.0" "@layerzerolabs/lz-v2-utilities" "2.3.45-oft-rc.0" "@noble/ed25519" "^2.0.0" - "@orderly.network/core" "2.0.0" - "@orderly.network/types" "2.0.0" + "@orderly.network/core" "2.0.1-alpha.1" + "@orderly.network/types" "2.0.1-alpha.1" "@solana/spl-token" "0.4.8" "@solana/wallet-adapter-base" "0.9.23" "@solana/web3.js" "1.95.3" @@ -2326,73 +2326,75 @@ ethereum-cryptography "2.2.1" ethers "^6.13.2" -"@orderly.network/hooks@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/hooks/-/hooks-2.0.0.tgz#3cb71230fcdc74b1d8e17481988d55239dac8f6d" - integrity sha512-MJmVSA3zZUxM0h0a7Q4We/G6ERkaMgKNthWr8pZ4WPESmJ0VVXDSRl/b4+Obp4Q+NK4cR4Wfq1AA5+r8HFsAXA== +"@orderly.network/hooks@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/hooks/-/hooks-2.0.1-alpha.1.tgz#c87264aa32ce43b27b1761e07ccbad6f78d5f675" + integrity sha512-nA3nCc8CQySDaJfkF8k9P5FZGoA7agG5pNxAisBBVu31vjXKPTPLMrla5wjQKAplbtvxXbnhwSaVkHuix+y+9A== dependencies: "@akamfoad/qr" "^0.4.0" - "@orderly.network/core" "2.0.0" - "@orderly.network/default-evm-adapter" "2.0.0" - "@orderly.network/default-solana-adapter" "2.0.0" - "@orderly.network/net" "2.0.0" - "@orderly.network/perp" "4.0.0" - "@orderly.network/types" "2.0.0" - "@orderly.network/utils" "2.0.0" - "@orderly.network/web3-provider-ethers" "2.0.0" + "@orderly.network/core" "2.0.1-alpha.1" + "@orderly.network/default-evm-adapter" "2.0.1-alpha.1" + "@orderly.network/default-solana-adapter" "2.0.1-alpha.1" + "@orderly.network/net" "2.0.1-alpha.1" + "@orderly.network/perp" "4.0.1-alpha.1" + "@orderly.network/types" "2.0.1-alpha.1" + "@orderly.network/utils" "2.0.1-alpha.1" + "@orderly.network/web3-provider-ethers" "2.0.1-alpha.1" + immer "^10.1.1" ramda "^0.29.0" swr "2.2.4" use-constant "^1.1.1" use-debounce "^9.0.4" + zustand "^4.5.5" -"@orderly.network/net@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/net/-/net-2.0.0.tgz#0204c72b3cf7db769f7e75b10a9d064a16be2991" - integrity sha512-i6MT9GEf3aWs1+Q+XjrYtSOFl3TGDNjEwE1YcoGss+8+PyTnJP1UxBqAGeUqRRgwTVSggVaBUk2QLGq18T+j5g== +"@orderly.network/net@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/net/-/net-2.0.1-alpha.1.tgz#020516b0ff5d72970cd3b610be195658f832595a" + integrity sha512-RYdI9iC/pTcXLFzResEPW0XbegEb9StTLPEAZ3Qp3zsoScTBWAlvz1qopNfllnolv62Oj7htJOjel1o6wvBw5w== -"@orderly.network/perp@4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/perp/-/perp-4.0.0.tgz#2d7b8ac80fa11ffd76a9bc801016c8fddbb5545d" - integrity sha512-1O5cGurRS12tsCiBS6Fbyp/X1yJUt03m18IxQOjxjHknd7gRptmO2//UMESdGS8vXcq/gx6JIhSnTSi5VERKJQ== +"@orderly.network/perp@4.0.1-alpha.1": + version "4.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/perp/-/perp-4.0.1-alpha.1.tgz#0667e6fd38b1f81dd9d1769a9324d4c78d725b9d" + integrity sha512-dUAMQ16Q3Q39AlLBGHsAThjN6m63PaSI8PAQFehBIOBAicZnYiO0WFQwXWCV8x+Z+5o6v+Yn9vdKer01RXopFw== dependencies: - "@orderly.network/types" "2.0.0" - "@orderly.network/utils" "2.0.0" + "@orderly.network/types" "2.0.1-alpha.1" + "@orderly.network/utils" "2.0.1-alpha.1" -"@orderly.network/trading-view@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/trading-view/-/trading-view-2.0.0.tgz#d6c2d22ac182cf5435cb8304aa981265142b82de" - integrity sha512-IUeQ6eBTndNFB5YNJvl25nLaW6CatcPIeusCRTUgap26RpEQuYan1jp9W2Y+O2sq4CJKd+oC4w5X6X1YA/8fYw== +"@orderly.network/trading-view@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/trading-view/-/trading-view-2.0.1-alpha.1.tgz#854e1b5e05b03e7d634195076eafaba43feca66d" + integrity sha512-CjC/gKQjXq5K390YVjZCs/CktVpP4z+gCRhD0q7PWYDahm/KiBSal/X6JsJiPGFXeP0obDa0kEDzy+RpCr4Gqg== dependencies: - "@orderly.network/core" "2.0.0" - "@orderly.network/hooks" "2.0.0" - "@orderly.network/net" "2.0.0" - "@orderly.network/types" "2.0.0" - "@orderly.network/utils" "2.0.0" + "@orderly.network/core" "2.0.1-alpha.1" + "@orderly.network/hooks" "2.0.1-alpha.1" + "@orderly.network/net" "2.0.1-alpha.1" + "@orderly.network/types" "2.0.1-alpha.1" + "@orderly.network/utils" "2.0.1-alpha.1" -"@orderly.network/types@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/types/-/types-2.0.0.tgz#f8b7eeb5c904fdbed819f1f7cd2e1c28a5b32ac1" - integrity sha512-hh7Ht5Ebc07ZiTEeY4tYsVJHxvCXQUjzhVYcnSszTA03OyPAvYSxdawg7KWFG0NlYHk0yZdRinhehw87jScRuw== +"@orderly.network/types@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/types/-/types-2.0.1-alpha.1.tgz#2fecbde64276786c8d81c4d5a85b3adf8d4ec474" + integrity sha512-+jchX0XiY4/NkVTdFIX3pcKHWbj4t57oxTUttyVdNnLtPW++qYsXiIs0QVBTt9h1xbKuggII3aHCjkCx/SrGgw== dependencies: superstruct "^2.0.2" -"@orderly.network/utils@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/utils/-/utils-2.0.0.tgz#08b5847d040b2146834b8c5ec71e6c22924e55ca" - integrity sha512-9fBzlcv8fa49e3HhD8KYmdTXuzKKOFqZt0IqQd5FVrzem2hYGDAtSC3CLypgmRTj67KE0X0REK1ajsUYgpzjcw== +"@orderly.network/utils@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/utils/-/utils-2.0.1-alpha.1.tgz#e12da593c0529ecabec02765180544c48d17007c" + integrity sha512-q9M2gcAeZm1AnagURECrYJSscZgFZN+aYh1hMuYDGNtc95uIgwe3zs8MqJYR1N7GsOulRSIK3sbQrtoj0lhw5g== dependencies: - "@orderly.network/types" "2.0.0" + "@orderly.network/types" "2.0.1-alpha.1" dayjs "^1.11.9" decimal.js-light "^2.5.1" -"@orderly.network/web3-provider-ethers@2.0.0", "@orderly.network/web3-provider-ethers@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@orderly.network/web3-provider-ethers/-/web3-provider-ethers-2.0.0.tgz#4c51bacc38a75082247ff99b6ad4dfeedbfe30da" - integrity sha512-0ZOI54E7+tgI4S9K3cxrPwLRNaSSZohZqsq+dxE3UlFGksFQx6YZeaEwkt4Si+QDRNRCMmxIWB/JX6adAZAktQ== +"@orderly.network/web3-provider-ethers@2.0.1-alpha.1": + version "2.0.1-alpha.1" + resolved "https://registry.yarnpkg.com/@orderly.network/web3-provider-ethers/-/web3-provider-ethers-2.0.1-alpha.1.tgz#169c9c298e99c364b35dc8b9a0a740b8b0671df3" + integrity sha512-6Ed2j1nQA9/AptVWXMV1XXEcGK+b9OnoEAaIWQKInFLppitfz0IcAh/g2T492FPgO6SVm/q+DzhoXY8aIa29hw== dependencies: "@enzoferey/ethers-error-parser" "^0.2.3" - "@orderly.network/default-evm-adapter" "2.0.0" - "@orderly.network/types" "2.0.0" + "@orderly.network/default-evm-adapter" "2.0.1-alpha.1" + "@orderly.network/types" "2.0.1-alpha.1" ethers "^6.13.2" "@parcel/watcher-android-arm64@2.4.1": @@ -5852,7 +5854,7 @@ aria-query@^5.3.2: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -7171,6 +7173,30 @@ dedent@^1.5.3: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== +deep-equal@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -7561,6 +7587,21 @@ es-errors@^1.2.1, es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + es-iterator-helpers@^1.0.19, es-iterator-helpers@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6" @@ -8633,7 +8674,7 @@ get-caller-file@^2.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -9068,6 +9109,11 @@ ignore@^5.2.0, ignore@^5.3.1: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== +immer@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" + integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -9109,7 +9155,7 @@ int64-buffer@^1.0.1: resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-1.0.1.tgz#c78d841b444cadf036cd04f8683696c740f15dca" integrity sha512-+3azY4pXrjAupJHU1V9uGERWlhoqNswJNji6aD/02xac7oxol508AsMC5lxKhEqyZeDFy3enq5OGWXF4u75hiw== -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -9166,7 +9212,7 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.0.4: +is-arguments@^1.0.4, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -9174,7 +9220,7 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-array-buffer@^3.0.4: +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -9332,7 +9378,7 @@ is-interactive@^1.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-map@^2.0.3: +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -9402,7 +9448,7 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -12103,7 +12149,7 @@ regenerator-runtime@^0.14.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42" integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ== @@ -12835,6 +12881,13 @@ std-env@^3.7.0: resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stoppable@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/stoppable/-/stoppable-1.1.0.tgz#32da568e83ea488b08e4d7ea2c3bcc9d75015d5b" @@ -13799,7 +13852,7 @@ use-sync-external-store@1.2.0: resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== -use-sync-external-store@^1.2.0: +use-sync-external-store@1.2.2, use-sync-external-store@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== @@ -14058,7 +14111,7 @@ which-builtin-type@^1.1.3: which-collection "^1.0.2" which-typed-array "^1.1.15" -which-collection@^1.0.2: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -14073,7 +14126,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -14348,6 +14401,13 @@ zod@^3.22.3: resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== +zustand@^4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.5.tgz#f8c713041543715ec81a2adda0610e1dc82d4ad1" + integrity sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q== + dependencies: + use-sync-external-store "1.2.2" + zwitch@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7"