{"version":3,"file":"static/js/665.fea9a453.chunk.js","mappings":"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","sources":["components/NumberFormat/index.tsx","constants/chain.ts","constants/global.ts","constants/storage.ts","utils/chain.tsx","utils/index.ts","utils/numberUtil.ts","utils/storage.ts","utils/token.ts","utils/portfolio.ts","utils/transform/account.ts","constants/launchpad/vault.tsx","constants/spot.ts","types/odyssey.ts","utils/axios.ts","utils/pairs.ts","features/futures/api.ts","types/socket.ts","worker/SynWorker.ts","utils/worker.ts","constants/polling.ts","../webpack/bootstrap","../webpack/runtime/amd options","../webpack/runtime/chunk loaded","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/make namespace object","../webpack/runtime/node module decorator","../webpack/runtime/runtimeId","../webpack/runtime/publicPath","../webpack/runtime/importScripts chunk loading","../webpack/runtime/nonce","../webpack/runtime/startup chunk dependencies","../webpack/startup"],"sourcesContent":["import './index.less';\n\nimport { AbstractTooltipProps } from 'antd/lib/tooltip';\nimport BN from 'bignumber.js';\nimport classNames from 'classnames';\nimport { BigNumber, BigNumberish } from 'ethers';\nimport React, { FC, ReactNode, useCallback, useMemo } from 'react';\nimport CountUp, { CountUpProps } from 'react-countup';\n\nimport { WrappedBigNumber } from '@/entities/WrappedBigNumber';\nimport { bNToS, formatDisplayNumber, formatEther, formatNumber, toBN, toWad } from '@/utils/numberUtil';\n\nimport { Tooltip } from '../ToolTip';\ninterface IFormatNumberTooltipWrapProps {\n num: BigNumberish | BN;\n formattedNumStr?: string | undefined;\n colorShader?: boolean;\n isBold?: boolean;\n isShowTBMK?: boolean;\n toolTipProps?: AbstractTooltipProps;\n showToolTip?: boolean;\n prefix?: string;\n suffix?: string;\n colorSuffix?: boolean;\n isShowApproximatelyEqualTo?: boolean;\n showZeroIfNegative?: boolean;\n countUpProps?: Omit;\n showPositive?: boolean;\n minDecimalPlaces?: number;\n isUseMockNumber?: boolean;\n isShowSuffixInTooltip?: boolean;\n}\n\ntype DisplayStrWithCountUpTypes = {\n num: BN;\n iProps?: Omit;\n formattedNumStr?: string;\n isShowTBMK?: boolean;\n};\n/**\n * TODO: temp for start\n * @param num\n * @returns\n */\nexport function negativeNumberColor(num: BN): string {\n return toBN(num).gte(0) ? '#14B84B' : '#FF6666';\n}\n\nconst DisplayStrWithCountUp: FC = ({ num, iProps }) => {\n // get number decimals;\n\n const defaultProps = {\n duration: 1,\n useEasing: true,\n useGrouping: true,\n preserveValue: true,\n ...iProps,\n decimals: 9,\n } as CountUpProps;\n const formattingFn = useCallback((value: number | null) => {\n const formatNum = formatDisplayNumber({ num: value || 0, type: 'price' });\n return formatNum;\n }, []);\n\n return (\n \n );\n};\nconst formatNumberTooltipWrap: FC = function ({\n num,\n formattedNumStr,\n colorShader = false,\n isBold = false,\n isShowTBMK = false,\n toolTipProps,\n prefix,\n suffix,\n showToolTip = true,\n countUpProps,\n showPositive,\n colorSuffix = false,\n isShowApproximatelyEqualTo,\n minDecimalPlaces,\n showZeroIfNegative,\n isUseMockNumber = false,\n isShowSuffixInTooltip = false,\n}) {\n let numRes = toBN(isUseMockNumber ? '1234567899876' : num || '');\n if (numRes.lt(0) && showZeroIfNegative) {\n numRes = toBN(0);\n }\n function displayStrWithCountUp(num: BN, disPlayStr: string) {\n return countUpProps && !num.isNaN() && !num.isZero() ? (\n \n ) : (\n disPlayStr\n );\n }\n\n const suffixDom = suffix && {suffix};\n\n function showColorNumber(colorShader: boolean, num: BN, disPlayStr: string, isBold = false): JSX.Element {\n if (isBold) {\n return colorShader && !num.eq(0) ? (\n \n \n {prefix}\n {displayStrWithCountUp(num, disPlayStr)}\n \n {suffixDom}\n \n ) : (\n \n \n {prefix}\n {displayStrWithCountUp(num, disPlayStr)}\n \n {suffixDom}\n \n );\n }\n return colorShader && !num.eq(0) ? (\n \n \n {prefix}\n {displayStrWithCountUp(num, disPlayStr)}\n {colorSuffix && suffixDom}\n \n {!colorSuffix && suffixDom}\n \n ) : (\n \n \n {prefix}\n {displayStrWithCountUp(num, disPlayStr)}\n \n {suffixDom}\n \n );\n }\n\n let displayNumStr = numRes.eq(0) ? '0.00' : numRes.toString();\n if (formattedNumStr) {\n displayNumStr = formattedNumStr;\n } else {\n displayNumStr = formatDisplayNumber({\n num: numRes,\n showPositive,\n isShowTBMK,\n isShowApproximatelyEqualTo,\n minDecimalPlaces,\n });\n }\n\n if (prefix === '$') {\n if (displayNumStr.startsWith('-')) {\n prefix = '-$';\n displayNumStr = displayNumStr.slice(1);\n }\n if (displayNumStr.startsWith('+')) {\n prefix = '+$';\n displayNumStr = displayNumStr.slice(1);\n }\n if (displayNumStr.startsWith('<')) {\n prefix = '<$';\n displayNumStr = displayNumStr.slice(1);\n }\n }\n\n return showToolTip && !numRes.eq(0) ? (\n \n {showColorNumber(colorShader, numRes, displayNumStr, isBold)}\n \n ) : (\n showColorNumber(colorShader, numRes, displayNumStr, isBold)\n );\n};\n\n/**\n * formatNumberWithTooltip\n * @param num orgin number\n * @param showTooltip Whether tooltip is displayed\n * @param colorShader Whether to color negative numbers,\n * @returns\n */\nexport type FormatNumberWithTooltipType = Omit;\nexport const formatNumberWithTooltip = ({\n num,\n colorShader = false,\n isBold = false,\n isShowTBMK = false,\n toolTipProps,\n prefix,\n suffix,\n showPositive,\n colorSuffix,\n countUpProps,\n isShowApproximatelyEqualTo,\n showZeroIfNegative,\n showToolTip,\n minDecimalPlaces,\n isUseMockNumber,\n isShowSuffixInTooltip,\n}: FormatNumberWithTooltipType): React.ReactNode => {\n return formatNumberTooltipWrap({\n num,\n colorShader,\n isBold,\n toolTipProps,\n isShowTBMK,\n prefix,\n suffix,\n colorSuffix,\n countUpProps,\n showPositive,\n isShowApproximatelyEqualTo,\n showToolTip,\n minDecimalPlaces,\n showZeroIfNegative,\n isUseMockNumber,\n isShowSuffixInTooltip,\n });\n};\n\n/**\n * format price num display\n * @param num price\n * @param decimals default decimals\n * @param colorShader is show diff color\n * @param keepMaxOriginalNumber is keep original number\n * @returns\n */\nexport const formatPriceNumberWithTooltip = ({\n num,\n colorShader = false,\n isOperateNum = false,\n isShowTBMK = false,\n prefix,\n isShowApproximatelyEqualTo,\n suffix,\n showPositive,\n significantDigits,\n roundingMode,\n}: {\n num: BigNumberish | BN;\n colorShader?: boolean;\n isBold?: boolean;\n toolTipProps?: AbstractTooltipProps;\n isOperateNum?: boolean;\n isShowTBMK?: boolean;\n prefix?: string;\n isShowApproximatelyEqualTo?: boolean;\n suffix?: string;\n showPositive?: boolean;\n significantDigits?: number;\n roundingMode?: BN.RoundingMode;\n}): React.ReactNode => {\n const formattedNumStr = formatDisplayNumber({\n num,\n type: 'price',\n isOperateNum,\n isShowApproximatelyEqualTo,\n showPositive,\n significantDigits,\n roundingMode,\n });\n return formatNumberTooltipWrap({\n num,\n formattedNumStr,\n colorShader,\n isShowTBMK,\n prefix,\n suffix,\n });\n};\n\n/**\n * format liquidation price num display\n * if price >= 1e6 display as 0\n * @param num price\n * @param decimals default decimals\n * @param colorShader is show diff color\n * @param keepMaxOriginalNumber is keep original number\n * @returns\n */\nexport const formatLiqPriceNumberWithTooltip = ({\n num,\n colorShader = false,\n suffix,\n ...options\n}: FormatNumberWithTooltipType): React.ReactNode => {\n const price = toBN(num);\n let formattedNumStr = '';\n if (!price.eq(0)) {\n if (price.abs().gte(1e6)) {\n num = Infinity;\n } else if (price.lt(0)) {\n num = 0;\n }\n formattedNumStr = formatDisplayNumber({ num, type: 'price' });\n }\n return formatNumberTooltipWrap({ num, formattedNumStr, colorShader, suffix, ...options });\n};\n\nexport const useFormatLiqPriceNumberWithTooltip = ({\n num,\n colorShader = false,\n}: {\n num: BigNumberish;\n colorShader?: boolean;\n}): React.ReactNode => {\n return useMemo(() => {\n return formatLiqPriceNumberWithTooltip({ num, colorShader });\n }, [colorShader, num]);\n};\n\nexport const formatStringWithTooltip = ({\n str,\n title,\n isBold = false,\n toolTipProps,\n}: {\n str: string;\n title: string;\n isBold?: boolean;\n toolTipProps?: AbstractTooltipProps;\n}): React.ReactNode => {\n return (\n \n {isBold ? {str} : {str}}\n \n );\n};\n\nexport function formatLeverageWithTooltip(leverage: BigNumber | undefined): ReactNode {\n const leverageFormatted = formatEther(leverage);\n if (leverage?.lt(0)) return <>-;\n return <>{leverage?.eq(0) ? 0 : leverage?.lt(toWad(0.1)) ? <>< 0.1 : formatNumber(leverageFormatted, 1)}x;\n // return (\n // \n // {leverage?.eq(0) ? 0 : leverage?.lt(toWad(0.1)) ? <>< 0.1 : formatNumber(leverageFormated, 2)}x\n // \n // );\n}\n\nexport function formatPercentage({\n percentage,\n hundredfold = true,\n colorShader = true,\n customTitle,\n decimals = 2,\n withThreshHold,\n prefix = '',\n suffix = '',\n isColorShaderWhiteIfZero = false,\n isHiddenIfZero = false,\n requirePlusSymbol = false,\n className,\n}: {\n percentage: number | string;\n hundredfold?: boolean;\n colorShader?: boolean;\n customTitle?: ReactNode;\n decimals?: number;\n withThreshHold?: boolean;\n prefix?: string;\n suffix?: string;\n isColorShaderWhiteIfZero?: boolean;\n isHiddenIfZero?: boolean;\n requirePlusSymbol?: boolean;\n className?: string;\n}): ReactNode {\n const percentageNumber = WrappedBigNumber.from(percentage).mul(hundredfold ? 100 : 1);\n let displayString = formatNumber(percentageNumber, decimals);\n\n if (withThreshHold) {\n const percentageBN = WrappedBigNumber.from(percentageNumber);\n const threshold = WrappedBigNumber.from(1 / 10 ** decimals);\n if (percentageBN.notEq(0) && percentageBN.abs().lt(threshold)) {\n displayString = '<' + (percentageNumber.gt(0) ? '' : '-') + threshold.stringValue;\n }\n }\n let colorShaderClassname = colorShader ? (percentageNumber.lt(0) ? 'text-danger' : 'text-success') : '';\n if (isColorShaderWhiteIfZero && percentageNumber.eq(0)) {\n colorShaderClassname = '';\n }\n if (percentageNumber.eq(0) && isHiddenIfZero) {\n return null;\n }\n let plusMinusSymbol = '';\n if (requirePlusSymbol) {\n if (percentageNumber.gt(0)) {\n plusMinusSymbol = '+';\n }\n }\n return (\n \n {`${plusMinusSymbol}${prefix}${displayString}%${suffix}`}\n \n );\n}\n","import { CHAIN_ID } from '@derivation-tech/context';\nimport { arbitrum, base, blast, blastSepolia, linea } from 'wagmi/chains';\n\nimport { getDappChainConfig } from '@/configs/chain';\nimport { IDappChainConfig, ISynfConfigInfo } from '@/types/chain';\nimport { BackendChainsConfig } from '@/types/config';\nimport { getChainConfigInfo } from '@/utils/chainConfig';\n\n/**\n * available chain id array\n */\nlet SUPPORTED_CHAIN_ID = [CHAIN_ID.BLAST, CHAIN_ID.BASE];\n\nif (process.env.REACT_APP_AVAILABLE_CHAIN_ID) {\n const arr = process.env.REACT_APP_AVAILABLE_CHAIN_ID.split(',');\n if (arr && arr.length > 0) {\n SUPPORTED_CHAIN_ID = arr.map((chainIdStr) => Number(chainIdStr));\n }\n}\n\n/**\n * display chain id array in [Select a Network] modal\n * Usually remove the test network\n */\nlet DISPLAYABLE_CHAIN_ID = [CHAIN_ID.BASE, CHAIN_ID.BLAST];\n\nif (process.env.REACT_APP_DISPLAYABLE_CHAIN_ID) {\n const arr = process.env.REACT_APP_DISPLAYABLE_CHAIN_ID.split(',');\n if (arr && arr.length > 0) {\n DISPLAYABLE_CHAIN_ID = arr.map((chainIdStr) => Number(chainIdStr));\n }\n}\n\n/**\n * default chain id for wrong network\n */\nconst DEFAULT_CHAIN_ID: number = parseInt(process.env.REACT_APP_CHAIN_ID ?? '1');\n\nconst chainConfigs: {\n [chainId: number]: ISynfConfigInfo;\n} = {\n [CHAIN_ID.LINEA]: getChainConfigInfo(CHAIN_ID.LINEA),\n [CHAIN_ID.BLASTSEPOLIA]: getChainConfigInfo(CHAIN_ID.BLASTSEPOLIA),\n [CHAIN_ID.BLAST]: getChainConfigInfo(CHAIN_ID.BLAST),\n [CHAIN_ID.ARBITRUM]: getChainConfigInfo(CHAIN_ID.ARBITRUM),\n [CHAIN_ID.BASE]: getChainConfigInfo(CHAIN_ID.BASE),\n};\n\nconst DAPP_CHAIN_CONFIGS: {\n [chainId: number]: IDappChainConfig;\n} = {\n [CHAIN_ID.LINEA]: getDappChainConfig(CHAIN_ID.LINEA, linea),\n [CHAIN_ID.BLASTSEPOLIA]: getDappChainConfig(CHAIN_ID.BLASTSEPOLIA, blastSepolia),\n [CHAIN_ID.BLAST]: getDappChainConfig(CHAIN_ID.BLAST, blast),\n [CHAIN_ID.ARBITRUM]: getDappChainConfig(CHAIN_ID.ARBITRUM, arbitrum),\n [CHAIN_ID.BASE]: getDappChainConfig(CHAIN_ID.BASE, base),\n};\n\nexport const getAllDisplayableChainMarketCustomPairs = (backendChainsConfig: BackendChainsConfig) =>\n DISPLAYABLE_CHAIN_ID.reduce(\n (prev, curr) => {\n return [\n ...prev,\n ...(backendChainsConfig[curr]?.marketCustomPairs || []).map((pairInfo) => ({ ...pairInfo, chainId: curr })),\n ];\n },\n [] as {\n id: string;\n title: string;\n pairs: string[];\n chainId: CHAIN_ID;\n }[],\n );\nexport const quoteTokenSymbolColors = [\n '#00BFBF',\n '#00CC99',\n '#1B9844',\n '#30E84F',\n '#396A93',\n '#4D88FF',\n '#5555F6',\n '#5C5CD6',\n '#6495ED',\n '#66CCFF',\n '#7C67E4',\n '#88CC00',\n '#8FBC8F',\n '#99BBFF',\n '#BF40BF',\n '#C270C2',\n '#CCAA00',\n '#F98686',\n '#FF69B4',\n '#FF8C00',\n '#FF4500',\n '#FFD700',\n '#ADFF2F',\n '#7FFF00',\n '#32CD32',\n '#00FA9A',\n '#00CED1',\n '#4682B4',\n '#4169E1',\n '#8A2BE2',\n '#9400D3',\n '#9932CC',\n '#8B008B',\n '#FF1493',\n '#FF6347',\n '#FF7F50',\n '#FFDAB9',\n '#EEE8AA',\n '#98FB98',\n '#AFEEEE',\n '#DDA0DD',\n];\n\nconst CHAIN_NAME_ID: { [key: string]: number } = {\n base: CHAIN_ID.BASE,\n blast: CHAIN_ID.BLAST,\n blastsepolia: CHAIN_ID.BLASTSEPOLIA,\n arbitrum: CHAIN_ID.ARBITRUM,\n linea: CHAIN_ID.LINEA,\n goerli: CHAIN_ID.GOERLI,\n};\n\nexport const SHOW_BUILD_CHAIN = [CHAIN_ID.BLAST, CHAIN_ID.BASE];\n\nexport {\n CHAIN_ID,\n CHAIN_NAME_ID,\n chainConfigs,\n DAPP_CHAIN_CONFIGS,\n DEFAULT_CHAIN_ID,\n DISPLAYABLE_CHAIN_ID,\n SUPPORTED_CHAIN_ID,\n};\n","export const DEFAULT_EMPTY_ACCOUNT = '0x0000000000000000000000000000000000000000';\n// leverage\nexport const DynamicLeverage = 'DynamicLeverage';\n\n// liquidity\nexport const CREATE_POOL_KEY = 'CREATING_POOL';\nexport enum LIQUIDITY_FORM_TYPE {\n CREATE = 'CREATE',\n ADD_REMOVE = 'ADD_REMOVE',\n}\nexport enum PAIR_PAGE_TYPE {\n TRADE = 'trade',\n EARN = 'earn',\n}\n\nexport const enum TRADE_LEVERAGE_THRESHOLDS {\n MIN = 0.1,\n MAX = 10,\n ACTUAL_MAX = 9.9,\n DEFAULT = 5,\n STEP = 0.1,\n ACTUAL_MAX_STEP = 0.1,\n}\n\n/**\n * show warning when slippage is higher than threshold\n */\nexport const enum SLIPPAGE_THRESHOLDS {\n LOW = 0.1,\n HIGH = 5, // show warning when bigger than 5%\n MIN = 0.01,\n MAX = 5,\n DEFAULT = 0.1,\n}\n\nexport const enum DEADLINE_THRESHOLDS {\n MIN = 1,\n MAX = 60,\n DEFAULT = 5,\n}\n\nexport enum FLEX_TABLE_TYPE {\n ACCOUNTS = 'ACCOUNTS',\n SEARCH = 'SEARCH',\n}\n\nexport const enum EARN_ALPHA_THRESHOLDS {\n MIN = 1,\n MAX = 5,\n DEFAULT = 4,\n DEFAULT_TICK = 20,\n DEFAULT_IMR = 0.1,\n}\n\nexport enum TABLE_TYPES {\n POSITION = 'Position',\n LIQUIDITY = 'Liquidity',\n LIQUIDITY_HISTORY = 'Liquidity History',\n OPEN_ORDERS = 'Open Orders',\n TRADE_HISTORY = 'Trade History',\n ORDER_HISTORY = 'Order History',\n TRANSFERS = 'Transfers',\n FUNDING = 'Funding',\n TRADING_PAIR = 'Trading Pair',\n ASSETS = 'Assets',\n PORTFOLIO_POSITIONS = 'Portfolio Positions',\n PORTFOLIO_LIQUIDITIES = 'Portfolio Liquidities',\n PORTFOLIO_OPEN_ORDERS = 'Portfolio Open Orders',\n EARN_LIST = 'Earn List',\n VOLUME_DETAIL = 'Volume-Detail',\n HISTORY = 'HISTORY',\n}\n\nexport const DEFAULT_DECIMALS = 18;\nexport const INPUT_NUMBER_STEP = 0.001;\n\nexport enum SEARCH_PAIR_SORTERS {\n FAVORITE = 'favorite',\n EARN_FAVORITE = 'earn.favorite',\n VOLUME_24H = '24HV',\n CHANGE_24H = '24HC',\n BOOSTED_LIQUIDITY = 'effectLiq',\n TVL = 'tvl',\n OI = 'oi',\n APY = 'apy',\n}\nexport const SEARCH_PAIR_SORTERS_TRANSLATION = {\n [SEARCH_PAIR_SORTERS.FAVORITE]: '24HV',\n [SEARCH_PAIR_SORTERS.EARN_FAVORITE]: 'earn.estApy',\n [SEARCH_PAIR_SORTERS.VOLUME_24H]: '24HV',\n [SEARCH_PAIR_SORTERS.CHANGE_24H]: '24HC',\n [SEARCH_PAIR_SORTERS.TVL]: 'tvl',\n [SEARCH_PAIR_SORTERS.OI]: 'oiS',\n [SEARCH_PAIR_SORTERS.APY]: 'table.liqApy',\n [SEARCH_PAIR_SORTERS.BOOSTED_LIQUIDITY]: 'effectLiq',\n};\nexport enum SEARCH_PAIR_DIRECTION {\n ASC = 'asc',\n DSC = 'desc',\n}\n\nexport const BATCH_INSTRUMENT_SIZE = 20;\n\nexport const SIGNIFICANT_DIGITS = 5;\n\nexport const PAIR_RATIO_BASE = 10000;\nexport const MMR_RATIO = 0.2;\nexport const TVL_THRESHHOLD = 0;\nexport const GLOBAL_TVL_THRESHHOLD = 100;\nexport const MARK_FAIR_DEV_THRESHHOLD = 0.005;\nexport const AIP_DOMAIN = 'https://api.synfutures.com';\n","const prefix = 'syn';\n\n/**\n * localStorage start\n */\nexport const LOCAL_THEME = `${prefix}-theme`;\nexport const ALL_USER_INFO = `${prefix}-all-user-info`;\nexport const LAST_POSITIONS_NUMBER = 'LAST_POSITIONS_NUMBER';\nexport const LAST_HISTORY_UNDERLYING_ADDR = 'LAST_HISTORY_UNDERLYING_ADDR';\nexport const MOBILE_ROUTE_BEFORE_SEARCH = 'MOBILE_ROUTE_BEFORE_SEARCH';\nexport const SYN_AGREE_TERM = `syn-agree-term`;\nexport const INITIAL_CHAIN_SELECTED = 'syn-initial-chain-selected';\nexport const GLOBAL_CONFIG = `global-config`;\nexport const GOT_PRICE_ROUNDED = `got-price-rounded`;\nexport const HIDE_HISTORY_TOOLTIP = `hide-history-tooltip`;\nexport const MOBILE_MINT_TOASTER = `mobile-mint-toaster`;\nexport const HIDE_REFRESH_HISTORY_DATA = 'hide_refresh_history_data';\nexport const FIRST_MYSTERY_BOX_POPPED = 'first_mystery_box_popped';\nexport const MOBILE_SHOW_CHART = 'mobile_show_chart';\nexport const MOBILE_SHOW_CHART_EARN = 'mobile_show_chart_earn';\nexport const CLAIM_TOKEN_MODAL_OPENED = 'claim_token_modal_opened';\nexport const TOKEN_ADDRESS_WARNING = 'token_address_warning';\nexport const SIGN_UP_SKIPPED = 'sign_up_skipped';\nexport const LAST_EPOCH_OPENED = 'last_epoch_opened';\nexport const PRICE_BASIS_FOR_PNL = 'price_basis_for_pnl';\nexport const HIDE_TVL_MODAL = 'HIDE_TVL_MODAL';\nexport const NO_SHOW_PNL_NOTIFICATION = 'NO_SHOW_PNL_NOTIFICATION';\nexport const WALLET_TYPE = 'WALLET_TYPE';\nexport const SEARCH_PAIR_SORTER = 'SEARCH_PAIR_SORTER';\nexport const SEARCH_PAIR_SORTER_DIRECTION = 'SEARCH_PAIR_SORTER_DIRECTION';\nexport const SYN_YEAR2024_SUMMARY = 'SYN_YEAR2024_SUMMARY_0';\nexport const GET_SYN_SPOT_SWAP_BUY_TOKEN = (chainId: number) => `SYN_SPOT_SWAP_BUY_TOKEN_${chainId}`;\nexport const GET_SYN_SPOT_SWAP_SELL_TOKEN = (chainId: number) => `SYN_SPOT_SWAP_SELL_TOKEN_${chainId}`;\n/**\n * localStorage end\n */\n\n/**\n * localForage start\n */\n// the localforage sometimes needs to be clean for newer releases\n// to achieve this simply bump up the keys down\n\nexport const S3_PAIRS_KEY = 'S3_PAIRS-3.4.2';\nexport const PAIRS_FAVORITES_KEY = 'PAIRS_FAVORITES-3.4.2';\nexport const LOCAL_SIGNED_UP = 'LOCAL_SIGNED_UP';\nexport const APP_CHAIN_ID = 'APP_CHAIN_ID';\nexport const LEVERAGE_CHOSEN = 'LEVERAGE_CHOSEN_3.4.2';\nexport const PAIR_CHOSEN = 'PAIR_CHOSEN_3.4.2';\nexport const SIGNATURE_FOR_ODYSSEY = 'SIGNATURE_FOR_ODYSSEY_1';\nexport const REFERRAL_CODE_FOR_ODYSSEY = 'REFERRAL_CODE_FOR_ODYSSEY_2';\nexport const JWT_FOR_ODYSSEY = 'JWT_FOR_ODYSSEY';\nexport const TGP_SHARED_JOIN_STATUS = 'tgp_shared_join_status';\nexport const JWT_FOR_TGP = 'JWT_FOR_TGP';\nexport const LOCAL_RPC_URL = 'LOCAL_RPC_URL';\nexport const PAIRS_PARTICIPATED = 'PAIRS_PARTICIPATED';\n\n/**\n * localForage end\n */\n","import { CHAIN_ID } from '@derivation-tech/context';\nimport { JsonRpcProvider, StaticJsonRpcProvider } from '@ethersproject/providers';\nimport { Overrides, providers } from 'ethers';\n\nimport { ReconnectingWebSocketProvider } from '@/connectors/WebSocketConnector/ReconnectingWebSocketProvider';\nimport { DAPP_CHAIN_CONFIGS, DEFAULT_CHAIN_ID, SUPPORTED_CHAIN_ID } from '@/constants/chain';\nimport { CHAIN_HTTP_RPC_URLS, CHAIN_WSS_RPC_URLS } from '@/constants/rpc';\nimport { APP_CHAIN_ID } from '@/constants/storage';\nimport { getRpcFromLocalForage } from './storage';\n/**\n * get chainName by Chain id\n * @param chainId\n * @returnschain\n */\nexport function getChainName(chainId: CHAIN_ID): string {\n let chainName = '';\n const dappChainConfig = DAPP_CHAIN_CONFIGS[chainId];\n if (dappChainConfig) {\n chainName = dappChainConfig.network.name || '';\n }\n\n return chainName;\n}\n\nexport function getChainShortName(chainId: CHAIN_ID): string {\n let chainName = '';\n if (DAPP_CHAIN_CONFIGS[chainId]) {\n chainName = DAPP_CHAIN_CONFIGS[chainId].network.shortName || '';\n }\n\n return chainName;\n}\n\nexport function getChainIdByChainShortName(chainShortName: string): CHAIN_ID | null | undefined {\n if (chainShortName) {\n let chainId: CHAIN_ID | null = null;\n Object.entries(DAPP_CHAIN_CONFIGS).map(([chainIdStr, chainConfig]) => {\n if (chainConfig.network.shortName === chainShortName) {\n chainId = Number(chainIdStr) as CHAIN_ID;\n }\n });\n\n return chainId;\n }\n}\n\nexport function getGasSettings(): Overrides {\n return { gasLimit: 2500000 };\n}\n\n/**\n * get default chainId from localStorage or default config\n * @returns\n */\nexport function getDefaultChainId(): number {\n const localChainId = localStorage.getItem(APP_CHAIN_ID);\n if (localChainId !== null) {\n if (SUPPORTED_CHAIN_ID.includes(Number(localChainId))) {\n return Number(localChainId);\n }\n }\n return DEFAULT_CHAIN_ID;\n}\n\nexport function isTestnet(chainId: number | undefined): boolean {\n return chainId ? DAPP_CHAIN_CONFIGS[chainId]?.network.isTestnet || false : false;\n}\n\nexport async function getWssProvider(\n chainId: number | undefined,\n url?: string,\n): Promise {\n if (!chainId || !CHAIN_WSS_RPC_URLS[chainId]) return undefined;\n if (!url) url = CHAIN_WSS_RPC_URLS?.[chainId]?.[0];\n return ReconnectingWebSocketProvider.getInstance(chainId, url);\n}\n\nexport function getHttpProvider(chainId: number | undefined, url?: string): JsonRpcProvider | undefined {\n if (chainId && !url) url = CHAIN_HTTP_RPC_URLS?.[chainId]?.[0];\n if (chainId && !url) {\n const dappChainConfig = DAPP_CHAIN_CONFIGS[chainId];\n url = dappChainConfig?.network.rpcUrl.public;\n }\n return new JsonRpcProvider(url, chainId);\n}\n\nconst chainBlockExplorerLinks = Object.values(DAPP_CHAIN_CONFIGS).map((config) => config.network.blockExplorer.url);\nexport const checkLinkIsBlockExplorer = (link: string) => {\n return chainBlockExplorerLinks.some((blockExplorerLink) =>\n link.toLowerCase().includes(blockExplorerLink.toLowerCase()),\n );\n};\n\nexport async function getProviderFromLocalOrSetting(chainId: number): Promise<\n | {\n type: 'wss';\n provider: ReconnectingWebSocketProvider;\n }\n | {\n type: 'https';\n provider: JsonRpcProvider;\n }\n> {\n const localRpcUrl = await getRpcFromLocalForage(chainId);\n // if no local rpc url, use the default rpc url\n if (!localRpcUrl) {\n const wssRpcUrl = CHAIN_WSS_RPC_URLS?.[chainId]?.[0];\n if (wssRpcUrl) {\n return {\n type: 'wss',\n provider: ReconnectingWebSocketProvider.getInstance(chainId, wssRpcUrl),\n };\n } else {\n return {\n type: 'https',\n provider: getFallbackProvider(chainId, CHAIN_HTTP_RPC_URLS?.[chainId]) as unknown as JsonRpcProvider, //new StaticJsonRpcProvider(httpsUrl, chainId),\n };\n }\n }\n // if local rpc url exists, use the local rpc url\n if (localRpcUrl.type === 'wss') {\n return {\n type: 'wss',\n provider: ReconnectingWebSocketProvider.getInstance(chainId, localRpcUrl.rpc),\n };\n } else {\n return {\n type: 'https',\n provider: new StaticJsonRpcProvider(localRpcUrl.rpc, chainId),\n };\n }\n}\n\nexport function getFallbackProvider(chainId: number, urls: string[]) {\n const stallTimeout = 1000;\n const proiders = urls.map((url) => new providers.StaticJsonRpcProvider(url, chainId));\n const params = proiders.map((provider, index) => {\n return {\n provider: provider,\n priority: 1 + index,\n weight: 1,\n stallTimeout,\n };\n });\n const provider = new providers.FallbackProvider(params);\n\n return provider;\n}\n","import { DEFAULT_THEME, THEME_ENUM } from '@/constants';\nimport { LOCAL_THEME } from '@/constants/storage';\nimport { WrappedBigNumber } from '@/entities/WrappedBigNumber';\nimport { WrappedQuote } from '@/entities/WrappedQuote';\nimport { BigNumber } from 'ethers';\nimport _ from 'lodash';\n\n/**\n * polling func\n * @param {Function} func\n * @param {Number} interval\n */\nexport const pollingFunc = (func: () => void, interval = 3000, immediately = true): NodeJS.Timeout => {\n if (immediately) {\n func();\n }\n return setInterval(() => {\n func();\n }, interval);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function bigNumberObjectCheck(obj: any): any {\n const cloneObj = _.clone(obj);\n if (cloneObj) {\n if (cloneObj) {\n try {\n Object.keys(cloneObj).forEach((key) => {\n const val = cloneObj[key];\n //reset bignumber if number is not correct class\n if (val?.bn && val?.value) {\n cloneObj[key] = BigNumber.from(val.value);\n } else if (val?._hex && BigNumber.isBigNumber(val) && !(val instanceof BigNumber)) {\n cloneObj[key] = BigNumber.from(val);\n } else if (val?.hex && val?.type === 'BigNumber') {\n cloneObj[key] = BigNumber.from(val);\n } else if (typeof val === 'object' && val && Object.keys(val).length > 0) {\n if (val instanceof WrappedBigNumber || val instanceof WrappedQuote) {\n cloneObj[key] = val;\n } else {\n const newVal = bigNumberObjectCheck(val);\n cloneObj[key] = newVal;\n }\n }\n });\n } catch (error) {\n console.error(error);\n }\n }\n }\n return cloneObj;\n}\n\nexport function getDefaultTheme(): THEME_ENUM {\n const localTheme = localStorage.getItem(LOCAL_THEME);\n if (localTheme) {\n return localTheme as THEME_ENUM;\n }\n return DEFAULT_THEME;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounceRequest Promise>(\n func: T,\n wait = 300,\n): (...args: Parameters) => Promise> {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters) => {\n return new Promise((resolve, reject) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func(...args)\n .then(resolve)\n .catch(reject);\n }, wait);\n });\n };\n}\n","import BN from 'bignumber.js';\nimport { BigNumber, BigNumberish, utils } from 'ethers';\nimport { parseUnits } from 'ethers/lib/utils';\nimport _ from 'lodash';\n\nimport { DEFAULT_DECIMAL_PLACES, ZERO } from '@/constants';\nimport { SIGNIFICANT_DIGITS } from '@/constants/global';\nimport { decimalShortFormSymbolMap, minExclusiveNumToShowShortDecimal } from '@/constants/number';\nimport { WrappedBigNumber } from '@/entities/WrappedBigNumber';\nimport { wdiv } from '@synfutures/sdks-perp';\n\n/**\n * Get the number of zeros behind the decimal point to the right of the first non-zero digit.\n *\n * @param {BigNumberish | BN} num - The input number for which to calculate the number of trailing zeros.\n * @returns {number} The number of zeros behind the decimal point to the right of the first non-zero digit.\n */\nexport function countNumTrailingZeros(num: BigNumberish | BN): number {\n const numBN = toBN(num);\n const numStr = numBN.toString(10);\n const decimalPart = numStr.split('.')[1];\n if (decimalPart) {\n let countZeros = 0;\n for (let i = 0; i < decimalPart.length; i++) {\n if (decimalPart[i] === '0') {\n countZeros++;\n } else {\n break;\n }\n }\n return countZeros;\n } else {\n return 0;\n }\n}\n\n/**\n * Get the short form of a decimal number with trailing zeros replaced by subscript symbols.\n *\n * @param {BN} numBN - The input BigNumber (BN) for which to create the short form of the decimal number.\n * @returns {string} The short form of the decimal number with trailing zeros replaced by subscript symbols.\n */\nexport function getShortFormDeciamal(numBN: BigNumberish | BN, tailSignificantDigits = 4): string {\n const maxCountZeros = 20;\n const numStr = numBN.toString(10);\n const countZeros = countNumTrailingZeros(numBN);\n const [integerPart, decimalPart] = numStr.split('.');\n if (countZeros > maxCountZeros || countZeros === 0) {\n return numStr;\n }\n\n const tail = decimalPart.slice(countZeros, decimalPart.length).slice(0, tailSignificantDigits);\n const tailWithPaddingZero = `${tail}${'0'.repeat(tailSignificantDigits - tail.length)}`;\n return `${integerPart}.0${decimalShortFormSymbolMap[countZeros]}${tailWithPaddingZero}`;\n}\n// the util function to make a bignumber, should be used whenever making a big number is need.\nexport function toBN(value: BigNumberish | BN, unit: 'normal' | 'ether' = 'normal'): BN {\n let number = value;\n if (unit === 'ether' && BigNumber.isBigNumber(value)) {\n number = utils.formatEther(value);\n }\n if (typeof number === 'undefined') {\n number = 0;\n }\n return new BN(number.toString(10), 10);\n}\n\n// equivalent to math.floor\nexport function bNRDown(value: BigNumberish | BN): BN {\n return toBN(value).integerValue(BN.ROUND_FLOOR);\n}\n\n// converting a bigNumber to string, should be used whenever converting is needed\nexport function bNToS(value: BigNumberish | BN, radix = 10): string {\n const res = toBN(value);\n return res.isNaN() ? '' : res.toString(radix);\n}\n\n/**\n * to show currency number with comma\n */\nconst toCurrencyNumber = (x: number | string): string => {\n const parts = x.toString().split('.');\n if (parts.length > 0) {\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n }\n return '';\n};\n\nconst CURRENCY_UNITS: ('K' | 'M' | 'B' | 'T')[] = ['K', 'M', 'B', 'T'];\nconst CURRENCY_UNIT_NUM = 10 ** 3; // 1000\n\nfunction getBigCurrencyNum(\n numBN: BN,\n unit: 'K' | 'M' | 'B' | 'T',\n roundingMode?: BN.RoundingMode,\n minDecimalPlaces = DEFAULT_DECIMAL_PLACES,\n): { numBN: BN; numStr: string; minDecimalPlaces?: number } {\n if (!roundingMode) roundingMode = BN.ROUND_DOWN;\n const i = CURRENCY_UNITS.findIndex((u) => u === unit);\n let numStr = numBN.toString(10);\n numBN = numBN.div(CURRENCY_UNIT_NUM);\n // get the biggest unit\n if (numBN.gte(CURRENCY_UNIT_NUM) && unit !== 'T') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n return getBigCurrencyNum(numBN, CURRENCY_UNITS[i + 1], roundingMode, minDecimalPlaces);\n }\n if (unit === 'T' && numBN.gte(CURRENCY_UNIT_NUM)) {\n numBN = numBN.integerValue(roundingMode);\n } else if (minDecimalPlaces !== 0) {\n numBN = numBN.precision(minDecimalPlaces, roundingMode);\n }\n\n numStr = `${\n minDecimalPlaces === 0 ? numBN.toFixed(0, roundingMode) : numBN.toPrecision(minDecimalPlaces, roundingMode)\n }${CURRENCY_UNITS[i]}`;\n\n return {\n numBN,\n numStr,\n };\n}\n\n/**\n * Format the given number for display with various options.\n *\n * @param {Object} options - The formatting options.\n * @param {BigNumberish | BN} options.num - The input number to be formatted.\n * @param {boolean} [options.isShowSeparator=true] - Whether to show separators in the formatted number.\n * @param {'price' | 'normal'} [options.type='normal'] - The type of formatting to apply.\n * @param {boolean} [options.isOperateNum=false] - Whether to the number is input which operate by user\n * @param {boolean} [options.isShowTBMK=false] - Whether to show TBMK unit for numbers greater than or equal to 10000.\n * @param {boolean} [options.showPositive] - Whether to show a positive sign for positive numbers.\n * @param {BN.RoundingMode} [options.roundingMode=BN.ROUND_DOWN] - The rounding mode to be used for formatting.\n * @param {number} [options.significantDigits=SIGNIFICANT_DIGITS] - The number of significant digits to display in the formatted number.\n * @param {number} [options.minDecimalPlaces=DEFAULT_DECIMAL_PLACES] - The minimum number of decimal places to display in the formatted number.\n * @param {boolean} [options.isShortFormDecimal=false] - Whether to use short form decimal notation.\n * @returns {string} The formatted number as a string.\n */\nexport function formatDisplayNumber({\n num,\n isShowSeparator = true,\n type = 'normal',\n isOperateNum = false,\n isShowTBMK = false,\n isShowApproximatelyEqualTo = true,\n showPositive,\n roundingMode = BN.ROUND_DOWN,\n significantDigits = SIGNIFICANT_DIGITS,\n minDecimalPlaces = DEFAULT_DECIMAL_PLACES,\n}: {\n num: BigNumberish | BN;\n isShowSeparator?: boolean;\n type?: 'price' | 'normal';\n isOperateNum?: boolean;\n isShowTBMK?: boolean;\n showPositive?: boolean;\n isShowApproximatelyEqualTo?: boolean;\n roundingMode?: BN.RoundingMode;\n significantDigits?: number;\n minDecimalPlaces?: number;\n}): string {\n let numBN = toBN(num);\n if (numBN.isNaN() || numBN.eq(Infinity)) {\n numBN = toBN(0);\n }\n let sign = '';\n if (numBN.isNegative()) {\n sign = '-';\n numBN = numBN.abs();\n } else if (showPositive && numBN.gt(0)) {\n sign = '+';\n }\n let numStr = numBN.toString(10);\n\n if (isOperateNum) {\n if (numBN.gte(1)) {\n numStr = numBN.toFixed(minDecimalPlaces, roundingMode);\n } else {\n numStr = numBN.toPrecision(minDecimalPlaces, roundingMode);\n }\n } else {\n // >=1000 use TBMK unit\n if (numBN.eq(0)) {\n numStr = numBN.toFixed(2, roundingMode);\n } else if (numBN.gte(10000)) {\n const numRes = numBN.integerValue(roundingMode);\n numStr = numRes.toString();\n if (isShowTBMK) {\n const numRes = getBigCurrencyNum(numBN, 'K', roundingMode, minDecimalPlaces);\n numStr = numRes.numStr;\n }\n } else if (numBN.gte(1000) && numBN.lt(10000)) {\n if (type === 'price') {\n numBN = numBN.precision(significantDigits, roundingMode);\n numStr = numBN.toPrecision(significantDigits, roundingMode);\n } else {\n const numRes = numBN.precision(significantDigits, roundingMode);\n numStr = numRes.toPrecision(significantDigits, roundingMode);\n if (isShowTBMK) {\n const numRes = getBigCurrencyNum(numBN, 'K', roundingMode, minDecimalPlaces);\n numStr = numRes.numStr;\n }\n }\n } else if (numBN.gte(1) && numBN.lt(1000)) {\n numBN = numBN.precision(significantDigits, roundingMode);\n if (minDecimalPlaces === 0) {\n numStr = numBN.toFixed(0, roundingMode);\n } else {\n numStr = numBN.toPrecision(significantDigits, roundingMode);\n }\n } else if (numBN.gte(0.0001) && numBN.lt(1)) {\n if (type === 'price') {\n if (numBN.lt(BN(minExclusiveNumToShowShortDecimal)) && numBN.gt(BN(0))) {\n numBN = numBN.precision(significantDigits, roundingMode);\n numStr = getShortFormDeciamal(numBN);\n } else {\n numBN = numBN.precision(significantDigits, roundingMode);\n numStr = numBN.toPrecision(significantDigits, roundingMode);\n }\n } else {\n numStr = numBN.toFixed(minDecimalPlaces, roundingMode);\n }\n } else {\n if (type === 'price') {\n numBN = numBN.precision(significantDigits - 1, roundingMode);\n const decimalPlaces = numBN.decimalPlaces() || 0;\n if (numBN.lt(BN(minExclusiveNumToShowShortDecimal)) && numBN.gt(BN(0))) {\n numStr = getShortFormDeciamal(numBN);\n } else {\n if (decimalPlaces > 8) {\n numStr = numBN.toFixed(8, roundingMode);\n } else {\n numStr = numBN.toPrecision(4, roundingMode);\n }\n }\n } else {\n // show `<0.0001` when 0< num < 0.0001\n numStr = numBN.toFixed(minDecimalPlaces, roundingMode);\n return `${isShowApproximatelyEqualTo ? '≈' : ''}${numStr}`;\n }\n }\n }\n\n if (isShowSeparator) {\n numStr = toCurrencyNumber(numStr);\n }\n\n return `${sign}${numStr}`;\n}\n\n// remove zero after point\nexport function removeTrailingZeros(value: string | number): string {\n value = value.toString();\n if (value.match(/\\./)) {\n value = value.replace(/\\.?0+$/, '');\n }\n return value;\n}\n\n/**\n * number in thousands\n */\nconst numberWithCommas = (x: number | string): string => {\n const parts = x.toString().split('.');\n if (parts.length > 0) {\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return parts.join('.');\n }\n return '';\n};\n\n/**\n * format number, keep 4 decimals by default\n * (optional) comma to separate in thousands\n * @export\n * @param {(number | string)} numBN\n * @param {number} [decimals=DEFAULT_DECIMAL_PLACES]\n * @param {boolean} [isShowSeparator=true]\n * @param {number} [roundingMode=BigNumber.ROUND_DOWN]\n * @param {boolean} [isRemoveTrailingZeros=false]\n * @returns\n */\nexport function formatNumber(\n num: BigNumberish | BN,\n decimals: number = DEFAULT_DECIMAL_PLACES,\n isShowSeparator = true,\n roundingMode: BN.RoundingMode = BN.ROUND_DOWN,\n isRemoveTrailingZeros = false,\n): string {\n let numBN = toBN(num);\n if (\n // num === 'NaN' ||\n // num === undefined ||\n // num.toString().trim() === '' ||\n // Math.abs(Number(num)) === Infinity ||\n // Number.isNaN(Number(num))\n numBN.isNaN() ||\n numBN.eq(Infinity)\n ) {\n numBN = toBN(0);\n }\n\n let res = numBN.toFixed(decimals, roundingMode);\n\n if (isShowSeparator) {\n res = numberWithCommas(res);\n }\n if (isRemoveTrailingZeros) {\n res = removeTrailingZeros(res);\n }\n\n return res;\n}\n\n/**\n * make sure the number in range, otherwise convert it\n * make sure input legal num\n * number should between 1e6 and 1e-6 [1e-6, 1e6)\n * @export\n * @param {(number | string)} num the number user input\n * @param {number} [decimals=6]\n * @param {number} [biggestNumber=1e6 - 1e-4]\n * @returns return number with String type\n */\nexport function inputNumChecker(\n num: number | string,\n decimals = 4,\n allowMinus = false,\n // integerMaxLength = 6\n): string {\n num = num.toString();\n // Allow user input 00000\n if (Number(num) === 0) {\n return num;\n }\n // replace illegal digital\n const regex = allowMinus ? /[^0-9.-]/g : /[^0-9.]/g;\n num = num.replace(regex, '');\n const parts = num.split('.');\n // user paste the number contains more then two dot[.]\n if (parts.length >= 3) {\n return '';\n }\n let integerPart = parts[0];\n // remove leading zero except 1 zero\n if (integerPart.length > 0) {\n while (integerPart.length > 1 && integerPart[0] === '0') {\n integerPart = integerPart?.substring(1);\n }\n } else if (num.indexOf('.') === 0) {\n integerPart = '0';\n }\n // // max integer length <=7\n // if (integerPart.length > integerMaxLength) {\n // return (integerPart = integerPart.substring(0, integerMaxLength));\n // }\n\n let decimalPart = parts[1] || '';\n // only 8 decimal places\n if (decimalPart && decimalPart.length > decimals) {\n decimalPart = decimalPart?.substring(0, decimals);\n }\n\n if (decimalPart && decimalPart.length !== 0) {\n num = `${integerPart}.${decimalPart}`;\n } else {\n // get parse num except single [.]\n num = integerPart + (parts.length === 2 && decimals !== 0 ? '.' : '');\n }\n return num;\n}\n\n/**\n * to Reciprocal Number: 1/x\n * @param bn\n * @returns\n */\nfunction toEtherReciprocalNumber(bn: BigNumber): BigNumber {\n if (bn.eq(0)) {\n return bn;\n }\n return wdiv(toWad(1), bn);\n}\n\nexport function formatEther(num: BigNumber | undefined, isInverse = false): string {\n let bn = num || ZERO;\n if (isInverse && !bn.eq(ZERO)) {\n bn = toEtherReciprocalNumber(bn);\n }\n return utils.formatEther(bn);\n}\n\n/**\n * bigNumber type sort for ant table\n *\n * @export\n * @param {BigNumber} a\n * @param {BigNumber} b\n * @returns {(0 | 1 | -1)}\n */\nexport function bigNumberSort(a: undefined | WrappedBigNumber, b: undefined | WrappedBigNumber): 0 | 1 | -1 {\n if (!a || !b || a.eq(b)) return 0;\n return a.gt(b) ? 1 : -1;\n}\n\nexport function getExponentialScale(val: number): number {\n const expoentialRaw = Math.log10(val);\n return Math.floor(expoentialRaw);\n}\n\n/**\n * get an array of evenly spread numbers between to\n * @param count\n * @param start\n * @param end\n * */\n\nexport function getEvenArray(count: number, start: number, end: number, rounding = false): number[] {\n const result = [];\n const interval = rounding ? Math.floor((end - start) / count) : (end - start) / count;\n for (let i = 0; i < count; i++) {\n result.push(start + i * interval);\n }\n result.push(end);\n return result;\n}\n\n/**\n *\n * @export\n * @param {number} min\n * @param {number} max\n * @param {boolean} rounding\n * @returns {number[]}\n */\nexport function adjustMinMax(min: number, max: number, tickCount = 5): number[] {\n const minExponentialScale = getExponentialScale(min);\n const maxExponentialScale = getExponentialScale(max);\n let minPoint = min;\n // the max is two scales above the min\n if (maxExponentialScale > minExponentialScale + 1) {\n minPoint = 0;\n }\n let maxPoint = max;\n const diff = max - minPoint;\n const tickGap = roundByOneScale(diff / tickCount);\n // maxPoint = minPoint + tickCount * tickGap;\n if (tickCount > 10 && tickCount % 2 !== 0) {\n maxPoint = maxPoint + tickGap;\n }\n return [minPoint, maxPoint];\n}\n\n/**\n * roundUp to closest log number for use in coinprice chart\n * e.g 3456 to 3500\n * @export\n * @param {number} val\n * @param {boolean} up\n * @returns {number}\n */\nexport function roundByOneScale(value: number, up = true): number {\n const exponentialScale = getExponentialScale(value);\n const mainNumbers = value / 10 ** getExponentialScale(value);\n const newMainNumbers = Math.floor(mainNumbers * 10);\n return (newMainNumbers + (up ? 1 : 0)) * 10 ** (exponentialScale - 1);\n}\nexport function upRoundingByOneScale(value: number): number {\n const exponentialScale = getExponentialScale(value);\n if (exponentialScale !== 0) {\n const mainNumbers = Math.floor(value / 10 ** getExponentialScale(value)) + 1;\n return (mainNumbers < 5 ? 5 : 10) * 10 ** exponentialScale;\n }\n return 10;\n}\n\nexport function batchTranformBigNumberToWrap(value: T): Record {\n const keys = _.keys(value);\n return _.reduce(\n keys,\n (acc, cur) => {\n _.set(acc, [cur], WrappedBigNumber.from(_.get(value, [cur])));\n return acc;\n },\n {} as Record,\n );\n}\n\n/**\n * to wad, support float\n * @param wad\n * @returns\n */\nexport function toWad(num: BigNumberish, decimals = 0): BigNumber {\n return parseUnits(num.toString()).div(10 ** decimals);\n}\n/**\n * get tick points for use in coinprice chart\n * @export\n * @param {number} min\n * @param {number} max\n * @param {boolean} rounding\n * @returns {number[]}\n */\nexport function getTickPoints(min: number, max: number, tickGap?: number): number[] {\n const minExponentialScale = getExponentialScale(min);\n const maxExponentialScale = getExponentialScale(max);\n tickGap = tickGap || 10 ** (maxExponentialScale - 1);\n\n const diff = max - min;\n const tickNumber = Math.ceil(diff / tickGap);\n if (tickNumber >= 10) {\n if (tickNumber % 2 === 0) {\n return getTickPoints(min, max, tickGap * 2);\n } else {\n return getTickPoints(min, max + tickGap, tickGap * 2);\n }\n }\n if (tickNumber < 5) {\n return getTickPoints(min, max, 10 ** (minExponentialScale - 1));\n }\n return getEvenArray(tickNumber, min, max, false);\n}\n\nexport function formatPercentageString({\n percentage,\n hundredfold = true,\n decimals = 2,\n roundingMode = BN.ROUND_DOWN,\n}: {\n percentage: number | string;\n hundredfold?: boolean;\n decimals?: number;\n roundingMode?: BN.RoundingMode;\n}): string {\n const percentageNumber = WrappedBigNumber.from(percentage).mul(hundredfold ? 100 : 1);\n return `${formatNumber(percentageNumber, decimals, false, roundingMode)}%`;\n}\nexport function reduceArrayByStep(array: T[], step: number): T[] {\n const reducedArray: T[] = [];\n for (let i = 0; i < array.length; i += step) {\n reducedArray.push(array[i]);\n }\n const result = _.isEqual(_.last(reducedArray), _.last(array)) ? reducedArray : [...reducedArray, _.last(array) as T];\n return result;\n}\n","import Cookies from 'js-cookie';\nimport localforage from 'localforage';\nimport _ from 'lodash';\n\nimport {\n GLOBAL_CONFIG,\n JWT_FOR_ODYSSEY,\n JWT_FOR_TGP,\n LOCAL_RPC_URL,\n PAIRS_PARTICIPATED,\n REFERRAL_CODE_FOR_ODYSSEY,\n SIGNATURE_FOR_ODYSSEY,\n} from '@/constants/storage';\nimport { IGlobalConfig, IGlobalConfigStorage, ISignature, ISignatureStorage } from '@/types/global';\nimport { IOdysseySignature, IOdysseySignatureStorage } from '@/types/odyssey';\n\nexport async function saveGlobalConfigToLocalForage(config: IGlobalConfig): Promise {\n const configInStorage = ((await localforage.getItem(GLOBAL_CONFIG)) || {}) as IGlobalConfigStorage;\n _.set(configInStorage, [config.chainId], config);\n localforage.setItem(GLOBAL_CONFIG, configInStorage);\n}\n\nexport async function saveSignatureToLocalForage(signature: ISignature): Promise {\n const signatureInStorage = ((await localforage.getItem(SIGNATURE_FOR_ODYSSEY)) || {}) as ISignatureStorage;\n _.set(signatureInStorage, [signature.address || ''], signature);\n localforage.setItem(SIGNATURE_FOR_ODYSSEY, signatureInStorage);\n}\n\nexport async function getSignatureToLocalForage(address: string): Promise {\n const signatureInStorage = ((await localforage.getItem(SIGNATURE_FOR_ODYSSEY)) || {}) as ISignatureStorage;\n return _.get(signatureInStorage, [address || '']);\n}\n\nexport async function saveOdysseySignatureToLocalForage(signature: IOdysseySignature): Promise {\n const signatureInStorage = ((await localforage.getItem(SIGNATURE_FOR_ODYSSEY)) || {}) as IOdysseySignatureStorage;\n _.set(signatureInStorage, [signature.address || ''], signature);\n localforage.setItem(SIGNATURE_FOR_ODYSSEY, signatureInStorage);\n}\n\nexport async function getOdysseySignatureToLocalForage(address: string): Promise {\n const signatureInStorage = ((await localforage.getItem(SIGNATURE_FOR_ODYSSEY)) || {}) as IOdysseySignatureStorage;\n return _.get(signatureInStorage, [address || '']);\n}\n\nexport function getOdysseyJWTToken(address: string, chainId: number | undefined): string | undefined {\n const cookieStr = Cookies.get(`${JWT_FOR_ODYSSEY}-${address}-${chainId}`);\n return cookieStr;\n}\n\nexport function saveOdysseyJWTToken(address: string, jwtToken: string, chainId: number): void {\n Cookies.set(`${JWT_FOR_ODYSSEY}-${address}-${chainId}`, jwtToken, { expires: 30 });\n}\n\nexport async function saveOdysseyReferralCodeToLocalForage(\n code: string,\n userAddr: string | undefined,\n chainId: number,\n): Promise {\n const storage = ((await localforage.getItem(REFERRAL_CODE_FOR_ODYSSEY)) || {}) as {\n [chainId: number]: { [userAddr: string]: string };\n };\n _.set(storage, [chainId, userAddr || ''], code);\n localforage.setItem(REFERRAL_CODE_FOR_ODYSSEY, storage);\n}\n\nexport async function getOdysseyReferralCodeToLocalForage(\n userAddr: string | undefined,\n chainId: number,\n): Promise {\n const storage = ((await localforage.getItem(REFERRAL_CODE_FOR_ODYSSEY)) || {}) as {\n [chainId: number]: { [userAddr: string]: string };\n };\n return _.get(storage, [chainId, userAddr || '']);\n}\n\nexport function getTGPJWTToken(address: string): string | undefined {\n const cookieStr = Cookies.get(`${JWT_FOR_TGP}-${address}`);\n return cookieStr;\n}\n\nexport function saveTGPJWTToken(address: string, jwtToken: string): void {\n Cookies.set(`${JWT_FOR_TGP}-${address}`, jwtToken, { expires: 30 });\n}\n\nexport async function saveParticipatedPairsToLocalForage(\n pairs: { instrumentAddr: string; expiry: number }[],\n userAddr: string,\n chainId: number,\n): Promise {\n const storage = ((await localforage.getItem(PAIRS_PARTICIPATED)) || {}) as {\n [chainId: number]: { [userAddr: string]: { instrumentAddr: string; expiry: number }[] };\n };\n\n _.set(storage, [chainId, userAddr], pairs);\n localforage.setItem(PAIRS_PARTICIPATED, storage);\n}\n\nexport async function getParticipatedPairsFromLocalForage(\n userAddr: string,\n chainId: number,\n): Promise<{ instrumentAddr: string; expiry: number }[]> {\n const storage = ((await localforage.getItem(PAIRS_PARTICIPATED)) || {}) as {\n [chainId: number]: { [userAddr: string]: { instrumentAddr: string; expiry: number }[] };\n };\n const userStorage = _.get(storage, [chainId, userAddr]);\n return Object.values(userStorage || {});\n}\n\nexport async function saveSingleParticipatedPairsToLocalForage(\n pair: { instrumentAddr: string; expiry: number },\n userAddr: string,\n chainId: number,\n): Promise {\n const storage = ((await localforage.getItem(PAIRS_PARTICIPATED)) || {}) as {\n [chainId: number]: { [userAddr: string]: { instrumentAddr: string; expiry: number }[] };\n };\n\n const pairs: { instrumentAddr: string; expiry: number }[] = _.get(storage, [chainId, userAddr], []);\n if (!pairs.find((p) => p.instrumentAddr === pair.instrumentAddr && p.expiry === pair.expiry)) pairs.push(pair);\n _.set(storage, [chainId, userAddr], pairs);\n localforage.setItem(PAIRS_PARTICIPATED, storage);\n}\n\nexport async function saveRpcToLocalForage(chainId: number, rpc: string): Promise {\n const rpcInStorage = ((await localforage.getItem(LOCAL_RPC_URL)) || {}) as { [chainId: number]: string };\n if (rpc) {\n _.set(rpcInStorage, [chainId || ''], rpc);\n localforage.setItem(LOCAL_RPC_URL, rpcInStorage);\n } else {\n _.unset(rpcInStorage, [chainId || '']);\n localforage.setItem(LOCAL_RPC_URL, rpcInStorage);\n }\n}\n\nexport async function getRpcFromLocalForage(\n chainId: number,\n): Promise<{ rpc: string; type: 'wss' | 'https' } | undefined> {\n const signatureInStorage = ((await localforage.getItem(LOCAL_RPC_URL)) || {}) as { [chainId: number]: string };\n const rpc: string = _.get(signatureInStorage, [chainId || '']);\n if (rpc && rpc?.length) {\n if (rpc.startsWith('wss')) {\n return {\n rpc,\n type: 'wss',\n };\n }\n\n return {\n rpc,\n type: 'https',\n };\n }\n}\n","import { CHAIN_ID, TokenInfo as Token } from '@derivation-tech/context';\nimport { MarketType } from '@synfutures/sdks-perp';\nimport { BigNumber, constants } from 'ethers';\n\nimport { DAPP_CHAIN_CONFIGS } from '@/constants/chain';\nimport { DEFAULT_DECIMALS } from '@/constants/global';\nimport { WrappedInstrument } from '@/entities/WrappedInstrument';\nimport { TokenInfo, TokenInfoMap } from '@/types/token';\n\nexport function getTokenInfo(token: Token, chainId: CHAIN_ID): TokenInfo {\n return {\n ...token,\n id: token.address.toLowerCase(),\n address: token.address.toLowerCase(),\n chainId,\n decimals: token.decimals || DEFAULT_DECIMALS,\n };\n}\n\nexport function isWrappedNativeToken(chainId: CHAIN_ID, address: string, wrappedNativeToken?: Token): boolean {\n if (!wrappedNativeToken) {\n const dappChainConfig = DAPP_CHAIN_CONFIGS[chainId];\n wrappedNativeToken = dappChainConfig?.wrappedNativeToken;\n }\n\n return address?.toLowerCase() === wrappedNativeToken?.address?.toLowerCase();\n}\nexport function isNativeWrapNativePair(tokens: TokenInfo[]): boolean {\n return (\n tokens.filter((t) => isNativeTokenAddr(t.address) || isWrappedNativeToken(t.chainId, t.address)).length ===\n tokens.length\n );\n}\n\nexport function isNativeTokenAddr(tokenAddr: string): boolean {\n if (!tokenAddr) return false;\n return tokenAddr.toLowerCase() === constants.AddressZero;\n}\n\nexport function isNativeTokenInfo(token: TokenInfo, isSpot?: boolean): boolean {\n if (isSpot) {\n return isNativeTokenAddr(token?.address);\n }\n return isNativeTokenAddr(token?.address) && !token.id.startsWith(`${MarketType.LINK}_`);\n}\n\n/**\n * get wrappedNativeToken if token is native token\n * or just return the token\n * @param nativeToken\n * @param chainId\n * @returns\n */\nexport function wrapNativeToken(nativeToken: TokenInfo, chainId: CHAIN_ID, isSpot?: boolean): TokenInfo {\n const chainConfig = DAPP_CHAIN_CONFIGS[chainId];\n if (chainConfig && isNativeTokenInfo(nativeToken, isSpot) && chainConfig.wrappedNativeToken) {\n return getTokenInfo(chainConfig.wrappedNativeToken, chainId);\n }\n return nativeToken;\n}\nexport function wrapNativeAddress(tokenAddr: string | undefined, chainId: CHAIN_ID | undefined): string | undefined {\n if (chainId && tokenAddr && isNativeTokenAddr(tokenAddr)) {\n const chainConfig = DAPP_CHAIN_CONFIGS[chainId];\n if (chainConfig && chainConfig.wrappedNativeToken) {\n return getTokenInfo(chainConfig.wrappedNativeToken, chainId)?.address;\n }\n return tokenAddr;\n }\n return tokenAddr;\n}\n\n/**\n * get nativeToken if token is wrapped native token\n * or just return the token\n * @param wrappedNativeToken\n * @param chainId\n * @returns\n */\nexport function unWrapNativeToken(wrappedNativeToken: TokenInfo, chainId: CHAIN_ID): TokenInfo | undefined {\n const chainConfig = DAPP_CHAIN_CONFIGS[chainId];\n if (chainConfig && isWrappedNativeToken(chainId, wrappedNativeToken.address)) {\n return chainConfig.nativeToken;\n }\n return wrappedNativeToken;\n}\n\nexport function fixBalanceNumberDecimalsTo18(num: BigNumber, tokenDecimals: number): BigNumber {\n return num.mul(10 ** (18 - tokenDecimals));\n}\n\nexport function adjustBalanceNumberToTokenDecimals(num: BigNumber, tokenDecimals: number): BigNumber {\n return num.div(10 ** (18 - tokenDecimals));\n}\n\nexport function mappingToken({\n token,\n chainId,\n marketType,\n unWrappedNativeToken = false,\n}: {\n token: Token;\n marketType?: MarketType;\n chainId: CHAIN_ID;\n unWrappedNativeToken?: boolean;\n}): TokenInfo {\n const dappChainConfig = DAPP_CHAIN_CONFIGS[chainId];\n if (dappChainConfig) {\n if (unWrappedNativeToken && isWrappedNativeToken(chainId, token.address)) {\n if (dappChainConfig.nativeToken) token = dappChainConfig.nativeToken;\n }\n }\n\n const mToken: TokenInfo = getTokenInfo(token, chainId);\n\n // transform chainlink token's id\n if (marketType && [MarketType.LINK, MarketType.EMG, MarketType.PYTH].includes(marketType)) {\n // if (marketType && [MarketType.CHAINLINK, MarketType.SYNFUTURES].includes(marketType)) {\n mToken.id = `${marketType}_${mToken.symbol}`;\n }\n return mToken;\n}\n\nexport function getSanitizedFuturesSymbol(futures: WrappedInstrument, chainId: CHAIN_ID | undefined): string {\n if (chainId) {\n if (isWrappedNativeToken(chainId, futures.quoteToken.address)) {\n return `${futures.baseToken.symbol}-${unWrapNativeToken(futures.quoteToken as TokenInfo, chainId)?.symbol}-${\n futures.market.info.type\n }`;\n }\n if (isWrappedNativeToken(chainId, futures.baseToken.address)) {\n return `${unWrapNativeToken(futures.baseToken as TokenInfo, chainId)?.symbol}-${futures.quoteToken.symbol}-${\n futures.market.info.type\n }`;\n }\n return futures.displaySymbol;\n }\n return futures.displaySymbol;\n}\n\nexport function tokenArrToMap(tokens: Token[], chainId: CHAIN_ID): TokenInfoMap {\n return tokens.reduce((acc, token) => {\n acc[token.address.toLowerCase()] = getTokenInfo(token, chainId);\n return acc;\n }, {} as TokenInfoMap);\n}\n","import { IAccountRecords } from '@/types/account';\n\nimport { TWrappedVolume } from '@/components/TableCard/tableConfigs/WrappedVolume';\nimport { ZERO } from '@/constants';\nimport { WrappedPair } from '@/entities/WrappedPair';\nimport { Portfolio, Position, Side } from '@synfutures/sdks-perp';\nimport {\n transformMetaPortfolio,\n transformToMetaOrder,\n transformToMetaPosition,\n transformToMetaRange,\n} from './transform/account';\nexport function reducePortfolio(\n chainId: number,\n userAddr: string,\n instrumentAddr: string,\n portfolio: Portfolio,\n accountRecords?: IAccountRecords,\n): IAccountRecords {\n instrumentAddr = instrumentAddr.toLowerCase();\n if (!accountRecords) {\n accountRecords = {} as IAccountRecords;\n }\n if (!accountRecords.accountMap) accountRecords.accountMap = {};\n if (!accountRecords.positionMap) accountRecords.positionMap = {};\n if (!accountRecords.portfolioMap) accountRecords.portfolioMap = {};\n if (!accountRecords.orderMap) accountRecords.orderMap = {};\n if (!accountRecords.rangeMap) accountRecords.rangeMap = {};\n if (portfolio) {\n const blockInfo = portfolio.blockInfo || {\n height: 0,\n timestamp: 0,\n };\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountRecords!.blockInfo = blockInfo;\n const metaPortfolio = transformMetaPortfolio(userAddr, instrumentAddr, portfolio, blockInfo);\n accountRecords.portfolioMap[metaPortfolio.id] = metaPortfolio;\n const position = portfolio.position;\n const metaPosition = transformToMetaPosition({ userAddr, instrumentAddr, portfolio, position, blockInfo });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountRecords!.positionMap[metaPosition.id] = metaPosition;\n if (portfolio.orders)\n portfolio.orders.forEach((order) => {\n const metaOrder = transformToMetaOrder({ userAddr, instrumentAddr, portfolio, order, blockInfo });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountRecords!.orderMap[metaOrder.id] = metaOrder;\n });\n if (portfolio.ranges)\n portfolio.ranges.forEach((range) => {\n const metaRange = transformToMetaRange({ userAddr, instrumentAddr, portfolio, range, blockInfo });\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n accountRecords!.rangeMap[metaRange.id] = metaRange;\n });\n }\n accountRecords.chainId = chainId;\n return accountRecords;\n}\nexport const transformVolumeDataToCsvData = (volumeData: TWrappedVolume[]): object[] => {\n return volumeData.map((item) => {\n return {\n Date: item.timestamp ? new Date(item.timestamp * 1000).toLocaleString('en-GB') : item.timestamp,\n Pair: item.wrappedPair?.symbol,\n Margin: item.wrappedPair?.rootInstrument?.marginToken.symbol,\n 'Taker Volume': item.takerVolume,\n 'Taler Volume USD': item.takerVolumeInUsd,\n 'Maker Volume': item.makerVolume,\n 'Maker Volume USD': item.makerVolumeInUsd,\n 'Maker Rebate': item.makerRebate,\n 'Maker Rebate USD': item.takerVolumeInUsd,\n 'Take Fee': item.takerFee,\n 'Take Fee USD': item.takerFeeInUsd,\n };\n });\n\n return [];\n};\n\nexport function getEmptySDKPosition(pair: WrappedPair, traderAddr: string): Position {\n return {\n balance: ZERO,\n size: ZERO,\n entryNotional: ZERO,\n entrySocialLossIndex: ZERO,\n entryFundingIndex: ZERO,\n instrumentAddr: pair.instrumentAddr,\n expiry: pair.expiry,\n traderAddr: traderAddr,\n\n side: Side.LONG,\n entryPrice: ZERO,\n\n isInverse: pair.isInverse,\n\n blockInfo: pair.blockInfo,\n };\n}\n","import { BlockInfo } from '@derivation-tech/context';\n\nimport { IMetaAccount, IMetaOrder, IMetaPortfolio, IMetaPosition, IMetaRange } from '@/types/account';\n\nimport { Order, Portfolio, Position, Range } from '@synfutures/sdks-perp';\nimport { getAccountId, getOrderId, getPairId, getPortfolioId, getRangeId } from './transformId';\n\nexport function transformMetaAccount(portfolios: Portfolio[], blockInfo?: BlockInfo): Record {\n return portfolios.reduce((res, portfolio) => {\n const instrumentAddr = portfolio.instrumentAddr.toLowerCase();\n const accountId = getAccountId(portfolio.traderAddr, instrumentAddr);\n if (!res[accountId]) {\n res[accountId] = {\n id: accountId,\n userAddr: portfolio.traderAddr,\n instrumentId: instrumentAddr,\n portfolioIds: [],\n blockInfo: portfolio.blockInfo || blockInfo,\n };\n }\n res[accountId].portfolioIds.push(getPortfolioId(accountId, portfolio.expiry));\n return res;\n }, {} as Record);\n}\n\nexport function transformMetaPortfolio(\n userAddr: string,\n instrumentAddr: string,\n portfolio: Portfolio,\n blockInfo?: BlockInfo,\n): IMetaPortfolio {\n const accountId = getAccountId(userAddr, instrumentAddr);\n const id = getPortfolioId(accountId, portfolio.expiry);\n const pairId = getPairId(instrumentAddr, portfolio.expiry);\n\n return {\n id: id,\n instrumentId: instrumentAddr.toLowerCase(),\n pairId: pairId,\n accountId: accountId,\n blockInfo: blockInfo,\n ...portfolio,\n };\n}\n\nexport function transformToMetaPosition({\n portfolio,\n position,\n userAddr,\n instrumentAddr,\n blockInfo,\n}: {\n userAddr: string;\n instrumentAddr: string;\n portfolio: Portfolio;\n position: Position;\n blockInfo?: BlockInfo;\n}): IMetaPosition {\n const accountId = getAccountId(userAddr, instrumentAddr);\n const portfolioId = getPortfolioId(accountId, portfolio.expiry);\n const positionId = portfolioId;\n const pairId = getPairId(instrumentAddr, portfolio.expiry);\n\n return {\n id: positionId,\n instrumentId: instrumentAddr.toLowerCase(),\n accountId: accountId,\n portfolioId: portfolioId,\n pairId,\n blockInfo: position.blockInfo || blockInfo,\n ...position,\n };\n}\n\nexport function transformToMetaOrder({\n userAddr,\n instrumentAddr,\n portfolio,\n order,\n blockInfo,\n}: {\n userAddr: string;\n instrumentAddr: string;\n portfolio: Portfolio;\n order: Order;\n blockInfo?: BlockInfo;\n}): IMetaOrder {\n const accountId = getAccountId(userAddr, instrumentAddr);\n const portfolioId = getPortfolioId(accountId, portfolio.expiry);\n const orderId = getOrderId(portfolioId, order.oid);\n const pairId = getPairId(instrumentAddr, portfolio.expiry);\n\n return {\n id: orderId,\n instrumentId: instrumentAddr.toLowerCase(),\n accountId: accountId,\n portfolioId: portfolioId,\n pairId,\n blockInfo: order.blockInfo || blockInfo,\n ...order,\n };\n}\n\nexport function transformToMetaRange({\n userAddr,\n instrumentAddr,\n portfolio,\n range,\n blockInfo,\n}: {\n userAddr: string;\n instrumentAddr: string;\n portfolio: Portfolio;\n range: Range;\n blockInfo?: BlockInfo;\n}): IMetaRange {\n const accountId = getAccountId(userAddr, instrumentAddr);\n const portfolioId = getPortfolioId(accountId, portfolio.expiry);\n const rangeId = getRangeId(portfolioId, range.rid);\n const pairId = getPairId(instrumentAddr, portfolio.expiry);\n\n return {\n id: rangeId,\n instrumentId: instrumentAddr.toLowerCase(),\n accountId: accountId,\n portfolioId: portfolioId,\n pairId,\n blockInfo: range.blockInfo || blockInfo,\n ...range,\n };\n}\n\nfunction asUint24(x: number): number {\n const MAX_UINT_24 = (1 << 24) - 1;\n if (x < 0) {\n x += MAX_UINT_24;\n }\n return x;\n}\n\nexport function rangeKey(tickLower: number, tickUpper: number): number {\n return shiftLeft(asUint24(tickLower), 24) + asUint24(tickUpper);\n}\n\nexport function orderKey(tick: number, nonce: number): number {\n return shiftLeft(asUint24(tick), 24) + nonce;\n}\n\nfunction shiftLeft(x: number, n: number): number {\n return x * Math.pow(2, n);\n}\n","import { IVaultChainConfig, IVaultConfig } from '@/types/vault';\nimport { getChainName } from '@/utils/chain';\nimport { Stage } from '@synfutures/sdks-perp-launchpad';\nimport _ from 'lodash';\nimport * as vaultConfig from '../../configs/vault.json';\nimport { CHAIN_ID } from '../chain';\n\nexport const colWidths = [150, 100, 110, 120, 120];\ntype TVaultStageInfo = {\n color: string;\n bgColor: string;\n i18nId: string;\n};\n\nexport const vaultStageInfos: {\n [id in Stage]: TVaultStageInfo;\n} = {\n [Stage.INVALID]: {\n color: '#3D4F5C',\n bgColor: 'rgba(61, 79, 92, 0.20)',\n i18nId: 'launchpad.invalid',\n },\n [Stage.LIVE]: {\n color: '#14B84B',\n bgColor: 'rgba(20, 184, 75, 0.20)',\n i18nId: 'launchpad.live',\n },\n [Stage.SUSPENDED]: {\n color: '#FFAA00',\n bgColor: '#FFAA0033',\n i18nId: 'launchpad.suspend',\n },\n [Stage.UPCOMING]: {\n color: '#00BFBF',\n bgColor: 'rgba(0, 191, 191, 0.20)',\n i18nId: 'launchpad.upcoming',\n },\n};\n\nexport enum VaultActionId {\n 'deposit' = 'DEPOSIT',\n 'withdrawal' = 'WITHDRAW',\n 'depositFor' = 'DEPOSITFOR',\n}\n\ntype TVaultActionInfo = {\n i18nId: string;\n};\n\nexport const vaultActionInfos: {\n [id in VaultActionId]: TVaultActionInfo;\n} = {\n [VaultActionId['deposit']]: {\n i18nId: 'launchpad.vaultDeposit',\n },\n [VaultActionId['withdrawal']]: {\n i18nId: 'launchpad.vaultWithdrawal',\n },\n [VaultActionId['depositFor']]: {\n i18nId: 'launchpad.vaultDeposit',\n },\n};\n\nlet vaultConfigSingle = {} as IVaultConfig;\n\nexport function getVaultConfig(): IVaultConfig {\n if (vaultConfigSingle.chainConfig) {\n return vaultConfigSingle;\n }\n const config = vaultConfig;\n\n const chainConfig = _.reduce(\n config.chainConfig,\n (res, curr) => {\n const chainId = curr.chainId;\n\n res[chainId] = {\n ...curr,\n chainId,\n graphAddr: curr.graphAddr,\n };\n return res;\n },\n {} as {\n [chainId: number]: IVaultChainConfig;\n },\n );\n vaultConfigSingle = {\n ...config,\n chainConfig,\n } as IVaultConfig;\n return vaultConfigSingle;\n}\nexport const getVaultApiPrefix = (chainId: CHAIN_ID) =>\n `https://api.synfutures.com/v3/vault/${getChainName(chainId).toLowerCase()}`;\nexport const LEGAL_DISCLAIMER = 'https://docs.synfutures.com/oyster-amm/perp-launchpad/legal-disclaimer';\nexport { vaultConfig };\n","import { PoolType as SynPoolType } from '@synfutures/sdks-aggregator';\nimport _ from 'lodash';\nimport Aero from './assets/icon_aerodrome.png';\nimport ALB from './assets/icon_crypto_alb.png';\nimport Uni from './assets/icon_oracle_dexv2_uni.svg';\nimport Pancake from './assets/icon_pancakeswap.svg';\nimport Sushi from './assets/icon_sushiswap.svg';\n\nexport enum SPOT_KLINE_INTERVAL {\n H_1 = '1h',\n D_1 = '1d',\n W_1 = '1w',\n}\nexport const SPOT_KLINE_INTERVAL_TICK_GAP = {\n // 5 min\n [SPOT_KLINE_INTERVAL.H_1]: 1000 * 60 * 5,\n // 2 hours\n [SPOT_KLINE_INTERVAL.D_1]: 1000 * 60 * 60 * 2,\n // 1 Day\n [SPOT_KLINE_INTERVAL.W_1]: 1000 * 60 * 60 * 24,\n};\n\nexport const getSpotApiUrl = (url: string) =>\n `/v3/public/${process.env.REACT_APP_API_ENV === 'dev' ? 'dev/' : ''}aggregator/${url}`;\n\nconst CustomPoolType = {\n OTHER: 100,\n} as const;\n\nexport const SpotDexType = { ...SynPoolType, ...CustomPoolType } as const;\n\nexport const spotDexInfos: { [id in number]?: { name: string; imageSrc: string; version: string; color: string } } = {\n [SpotDexType.PANCAKE_V3]: { name: 'Pancake V3', imageSrc: Pancake, version: 'V3', color: '#fa0' },\n [SpotDexType.UNISWAP_V3]: { name: 'Uniswap V3', imageSrc: Uni, version: 'V3', color: '#fc74fe' },\n [SpotDexType.UNISWAP_V2]: { name: 'Uniswap V2', imageSrc: Uni, version: 'V2', color: '#fc74fe' },\n [SpotDexType.AERODROME_V3]: { name: 'Aerodrome V3', imageSrc: Aero, version: 'V3', color: '#00bfbf' },\n [SpotDexType.AERODROME_V2]: { name: 'Aerodrome V2', imageSrc: Aero, version: 'V2', color: '#00bfbf' },\n [SpotDexType.SUSHISWAP_V3]: { name: 'Sushiswap V3', imageSrc: Sushi, version: 'V3', color: '#b54848' },\n [SpotDexType.ALB_V3]: { name: 'ALB V3', imageSrc: ALB, version: 'V3', color: '#4d88ff' },\n [SpotDexType.OTHER]: { name: 'Others', imageSrc: '', version: '', color: '#000000' },\n};\n\nexport const spotStepRatio = [5, 10, 20];\nexport const defaultStepRatioOverride = 10;\n// base block time\nexport const SPOT_DETAIL_POLLING_INTERVAL = 1000 * 8;\nexport const SPOT_SIMULATION_TIME_OUT = 1000 * 4;\nexport const SPOT_HISTORY_GRAPH = 'https://api.synfutures.com/thegraph/base-aggregator';\nexport const SPOT_BALANCE_BATCH_SIZE = 500;\nexport const PoolTypePools = _.orderBy(\n Object.values(SynPoolType).filter((value) => typeof value === 'number'),\n [(pool) => _.get(spotDexInfos, [pool])?.name.toLowerCase()],\n ['asc'],\n);\n","import { BigNumber } from 'ethers';\n\nimport { OdysseyRewardId } from '@/configs/odysseyReward';\n\nexport enum ODYSSEY_TABS {\n // REWARDS = 'rewards',\n EARN_POINTS = 'earn_points',\n LEADER_BOARD = 'leader_board',\n}\nexport enum USER_STATUS {\n DEFAULT = 0,\n TWITTER_CONNECTED = 1,\n DISCORD_CONNECTED = 2,\n EMAIL_CONNECTED = 3,\n FIRST_BOX_OPENED = 4,\n EXTRA_POINTS_CLAIMED = 5,\n}\nexport interface IUserProfile {\n twitter: {\n id: string;\n username: string;\n profileImgUrl: string;\n };\n isKol: boolean;\n twitterId: string;\n profileImgUrl: string;\n inviterUsername?: string;\n username: string;\n referralCode: string;\n createdTime: number;\n status: USER_STATUS;\n}\n\nexport interface IOdysseySignature {\n nonce: number;\n inviteCode?: string;\n address: string;\n signature?: string;\n jwtToken?: string;\n}\n\nexport interface IOdysseySignatureStorage {\n [userAddr: string]: IOdysseySignature;\n}\n\nexport enum ODYSSEY_STEP {\n INIT,\n CONNECTED_WALLET,\n LINKED_TWITTER,\n FOLLOWED_DISCORD,\n FILLED_EMAIL,\n DONE,\n}\n\nexport interface IOdysseyRenzoPointsQuoteConfig {\n symbol: string;\n ezPoints?: number;\n eigenLayerPoints?: number;\n}\n\nexport interface IOdysseyChainConfig {\n earnOoPointPairs?: { pairSymbol: string; boost: number }[];\n earnBlastPointQuotes: string[];\n defaultPair: string;\n showLiquidityPoints: boolean;\n showTradePoints: boolean;\n showEarnBanner: boolean;\n nonBlastAndOoPointReward?: {\n [id in OdysseyRewardId]?: {\n quotes: {\n symbol: string;\n multiplier: number;\n }[];\n };\n };\n lastEpoch?: number;\n showLastEpochPointsModal?: boolean;\n twitter: {\n // client_ids: string[];\n callbackUrl: string;\n scope: string;\n code_challenge: string;\n kol: string[];\n open: string[];\n code_challenge_method: string;\n claimPointsTwitter: string;\n };\n}\n\nexport interface IOdysseyDappConfig {\n docsLink: string;\n earnPoints: {\n updateInterval: number; // in minutes\n earnLink: string;\n trade: {\n defaultPair: string;\n defaultChainId: number; // no pair will redirect to this chain\n };\n extraPointsRatio: number;\n spinDistributionIntervalType: 0 | 1 | 2; // 0: every hour, 1: every day, 2: every week;\n };\n squadConfig: {\n level1: {\n tvl: number;\n boost: number;\n };\n level2: {\n tvl: number;\n boost: number;\n };\n };\n supportChains: number[];\n chainConfig: {\n [chainId: string]: IOdysseyChainConfig;\n };\n sign: {\n agreement: string;\n };\n showOOTokenComingSoon: boolean;\n}\n\nexport interface ISquadMember {\n username: string;\n profileImgUrl: string;\n contributedPoints: number;\n contributedTVL: number;\n}\nexport interface IOdysseyDashboard {\n epoch: number;\n points: number;\n boost: number;\n spins: number;\n boxes: number;\n luck: number;\n estimatedPointsPerDay: number;\n referralBoost: number;\n referralBoostExpiry: number;\n estimatedSpinsPerWeek: number;\n nextSpinChance: number;\n squadTVL: number;\n squadCount: number;\n squadMembers: ISquadMember[];\n squadVolume: number;\n volumePoints: number;\n volumePointsUpdatedAt: number;\n}\n\nexport interface IRanking {\n rank: number;\n username: string;\n profileImgUrl: string;\n inviterUsername: string;\n points: number;\n tokens?: number;\n tokenHistory: { [epoch: number]: number };\n}\nexport interface ITokenRanking {\n rank: number;\n username: string;\n profileImgUrl: string;\n inviterUsername: string;\n amount: number;\n tokenHistory: { [epoch: number]: number };\n}\n\nexport interface ILeaderBoard {\n tvl: number;\n users: number;\n epoch: number;\n rankings: IRanking[];\n page: number;\n totals: number;\n tokenRankings: IRanking[];\n}\nexport interface ITokenLeaderBoard {\n ranking: ITokenRanking[];\n}\n\nexport interface IUserPoints {\n blastPoints: number;\n blastGold: number;\n odysseyPoints: number;\n ooToken: number;\n}\nexport interface ITokenProof {\n epoch: number;\n index: number;\n amount: string;\n proof: string[];\n}\nexport interface IEpoch {\n epoch: number;\n startTs: number;\n endTs: number;\n}\nexport interface IEpochDetail {\n epoch: number;\n lastRunAt: string;\n points: number;\n rank: number;\n squadVolume: number;\n userId: string;\n volumePoints: string;\n}\nexport interface IRecentJoin {\n username: string;\n inviterUsername: string | null;\n profileImgUrl: string;\n timestamp: number;\n}\n\nexport interface IResponse {\n code: number;\n msg: string;\n data: T;\n}\n\nexport enum CAMPAIGN_TYPE {\n TGP = 'tgp',\n ODYSSEY = 'odyssey',\n}\n\nexport interface ISpinResult {\n points: number;\n superSpins: number;\n}\n\nexport interface IInfoOverview {\n '7dActiveUsers': number;\n totalTradingVolume: number;\n totalTransactions: number;\n totalUsers: number;\n tvl: number;\n updateAt: number;\n}\n\nexport interface InstrumentPointConfigParam {\n isStable: boolean;\n quotePriceWad: BigNumber;\n poolFactorMap: Map;\n}\n","import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';\n\nimport { CAMPAIGN_TYPE } from '@/types/odyssey';\n\nimport { AIP_DOMAIN } from '@/constants/global';\nimport { getEncryptedHeader } from './SymmetricEncryption';\nimport { getOdysseyJWTToken, getTGPJWTToken } from './storage';\nexport async function axiosGet({\n url,\n address,\n config,\n type,\n}: {\n url: string;\n address?: string;\n config?: AxiosRequestConfig;\n type?: CAMPAIGN_TYPE;\n}): Promise {\n const jwtToken = type ? (type === CAMPAIGN_TYPE.TGP && address ? getTGPJWTToken(address) : undefined) : undefined;\n // need move params to url for encrypted\n\n if (config?.params) {\n const pa = new URLSearchParams(config.params);\n pa.sort();\n const params = pa.toString();\n url += (url.includes('?') ? '&' : '?') + params;\n config.params = undefined;\n }\n const encryptedData = getEncrypted({ url, jwtToken });\n if (encryptedData?.url) {\n url = encryptedData.url;\n }\n\n return await axios.get(url, {\n ...config,\n headers: {\n ...config?.headers,\n Authorization: jwtToken,\n ...encryptedData?.encryptedData,\n },\n });\n}\nexport async function axiosPost({\n url,\n address,\n data,\n config,\n type,\n chainId,\n}: {\n url: string;\n address?: string;\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n data?: any;\n config?: AxiosRequestConfig;\n type?: CAMPAIGN_TYPE;\n chainId?: number | undefined;\n}): Promise {\n const jwtToken = address\n ? type === CAMPAIGN_TYPE.TGP\n ? getTGPJWTToken(address)\n : getOdysseyJWTToken(address, chainId)\n : undefined;\n const encryptedData = getEncrypted({ url, jwtToken, body: data });\n if (encryptedData?.url) {\n url = encryptedData.url;\n }\n return await axios.post(url, data, {\n ...config,\n headers: {\n // 'Content-Type': 'application/x-www-form-urlencoded',\n ...config?.headers,\n Authorization: jwtToken,\n ...encryptedData?.encryptedData,\n },\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getEncrypted({\n url,\n jwtToken,\n body,\n}: {\n url: string;\n jwtToken?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n body?: any;\n}) {\n const domain = AIP_DOMAIN;\n if (!url.startsWith('http')) {\n if (!url.startsWith('/')) {\n url = '/' + url;\n }\n url = domain + url;\n }\n\n if (url.startsWith(domain)) {\n const uri = url.replace(domain, '');\n const encryptedHeader = getEncryptedHeader({\n uri,\n authorization: jwtToken,\n body: body,\n });\n\n return { encryptedData: encryptedHeader, url };\n }\n}\n","import { FeederType, PERP_EXPIRY, Side, Status } from '@synfutures/sdks-perp';\nimport { BigNumber } from 'ethers';\nimport moment from 'moment';\n\nimport { PERP } from '@/constants';\nimport { WrappedBigNumber, WrappedBigNumberLike } from '@/entities/WrappedBigNumber';\nimport { WrappedPair } from '@/entities/WrappedPair';\nimport { MARGIN_TYPE } from '@/types/global';\n\nimport { VirtualTradeType } from '@synfutures/sdks-perp-datasource';\nimport { showProperDateString } from './timeUtils';\n\nexport function pairExpiring(expiry: number): boolean {\n const expiryDate = moment(expiry * 1000).utc();\n const today = moment(new Date()).utc();\n return expiry !== 0 && expiryDate < today;\n}\nexport function isPairExpiredToday(expiry: number): boolean {\n const expiryDate = moment(expiry * 1000).utc();\n const today = moment(new Date()).utc();\n return expiry !== 0 && expiryDate.format('YYYY-MM-DD') === today.format('YYYY-MM-DD');\n}\n\nexport function getDisplayExpiry(expiry: number, format = 'MMDD'): string {\n return expiry === PERP_EXPIRY ? PERP : showProperDateString({ expiry, format });\n}\nexport function getExpiryNumberFromString(expiry: string): number {\n return expiry === 'PERP' ? PERP_EXPIRY : moment.utc(expiry).hour(8).unix();\n}\n\n/**\n * disable pair if pair expired or\n * in pool check today's liquidity\n * @param pair\n * @param tabType\n * @param disableExpiringPair\n * @returns\n */\nexport function isDisableExpiredPair(pair: WrappedPair, disableExpiringPair = true): boolean {\n if (disableExpiringPair) {\n if (pair.status === Status.SETTLED) {\n return true;\n }\n if (pairExpiring(pair.expiry)) {\n return true;\n }\n return false;\n }\n return false;\n}\n\nexport function isInverseType(feederType: FeederType | undefined): boolean {\n return !!feederType && [FeederType.BASE_STABLE].includes(feederType);\n}\n\nexport function getMarginTypeByFeeder(feederType: FeederType): MARGIN_TYPE {\n if ([FeederType.BOTH_STABLE, FeederType.QUOTE_STABLE].includes(feederType)) return MARGIN_TYPE.USD;\n return MARGIN_TYPE.COIN;\n}\n\n/**\n * to Reciprocal Number: 1/x\n * @param num\n * @returns\n */\nexport function toReciprocalNumber(num: WrappedBigNumberLike): WrappedBigNumber {\n const bn = WrappedBigNumber.from(num);\n if (bn.eq(0)) {\n return bn;\n }\n return WrappedBigNumber.from(1).div(bn);\n}\n\nexport function getAdjustTradeSide(\n tradeSide: Side,\n isInverse: boolean,\n considerSweepInTradeHistoryProps?: {\n type: VirtualTradeType;\n fee: BigNumber;\n },\n): Side {\n if (tradeSide === Side.FLAT) {\n return tradeSide;\n }\n const side = isInverse ? (tradeSide === Side.LONG ? Side.SHORT : Side.LONG) : tradeSide;\n if (considerSweepInTradeHistoryProps) {\n const { type, fee } = considerSweepInTradeHistoryProps;\n if (type === VirtualTradeType.LIQUIDATION && fee.isZero()) {\n return side === Side.LONG ? Side.SHORT : Side.LONG;\n }\n }\n return side;\n}\n\nexport function getAdjustTradePrice(price: WrappedBigNumberLike, isInverse: boolean): WrappedBigNumber {\n const bn = WrappedBigNumber.from(price);\n if (bn.isZero()) return bn;\n return isInverse ? WrappedBigNumber.from(1).div(bn) : bn;\n}\n\nexport function getAdjustTradeSize(size: WrappedBigNumberLike, isInverse: boolean): WrappedBigNumber {\n const bn = WrappedBigNumber.from(size);\n return isInverse ? bn.mul(-1) : bn;\n}\n","import { WrappedBigNumber } from '@/entities/WrappedBigNumber';\nimport { IDepthChartData } from '@/types/chart';\nimport { IFundingChart, IFuturesFundingRateData, IFuturesInstrument, IFuturesOrderBookAllSteps } from '@/types/futures';\nimport { IMarketPair } from '@/types/pair';\nimport { bigNumberObjectCheck, debounceRequest } from '@/utils';\nimport { axiosGet } from '@/utils/axios';\nimport { getAdjustTradePrice } from '@/utils/pairs';\nimport { getPairId } from '@/utils/transform/transformId';\nimport { Context } from '@derivation-tech/context';\nimport { Amm, MinimalPearl } from '@synfutures/sdks-perp';\nimport { DepthChartData, FundingChartInterval, KlineData, KlineInterval } from '@synfutures/sdks-perp-datasource';\nimport _ from 'lodash';\nimport moment from 'moment';\n\nexport async function fetchInstrumentFromChain(\n sdk: Context,\n instrumentAddr: string,\n expiry?: number,\n block?: number,\n): Promise {\n if (sdk) {\n const instrumentList = await sdk.perp.observer.getInstrument(\n [\n {\n instrument: instrumentAddr,\n expiries: expiry ? [expiry] : [],\n },\n ],\n { blockTag: block },\n );\n if (instrumentList.length > 0) {\n const futuresItem = instrumentList[0];\n\n block = futuresItem.blockInfo?.height || 0;\n\n return futuresItem;\n }\n }\n return null;\n}\n\nexport const fetchFuturesInstrument = debounceRequest(\n async (chainId: number, instrumentAddr: string): Promise => {\n const res = await axiosGet({\n url: 'https://api.synfutures.com/v3/public/perp/market/instrument',\n config: { params: { chainId, address: instrumentAddr } },\n });\n if (res?.data?.data) {\n const data = bigNumberObjectCheck(res.data.data);\n const amms = data.amms;\n return {\n ...data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n amms: amms.reduce((map: any, amm: any) => {\n map.set(amm.expiry, amm);\n return map;\n }, new Map()),\n };\n }\n return null;\n },\n 0,\n);\n\nexport const fetchFuturesPairInfo = async ({\n chainId,\n address,\n expiry,\n}: {\n chainId: number;\n address: string;\n expiry: number;\n}): Promise => {\n const res = await axiosGet({\n url: 'https://api.synfutures.com/v3/public/perp/market/pairInfo',\n config: { params: { chainId, address, expiry } },\n });\n if (res?.data?.data) {\n const p = res?.data?.data;\n const isInverse = p.isInverse;\n return {\n ...p,\n chainId: chainId,\n id: getPairId(p.instrumentAddress, p.expiry),\n fairPrice: WrappedBigNumber.from(p.fairPrice),\n markPrice: WrappedBigNumber.from(p.markPrice),\n fairPriceChange24h: WrappedBigNumber.from(p.fairPriceChange24h),\n markPriceChange24h: WrappedBigNumber.from(p.fairPriceChange24h),\n liquidityApy: WrappedBigNumber.from(p.liquidityApy),\n volume24h: WrappedBigNumber.from(p.volume24h),\n openInterests: WrappedBigNumber.from(p.openInterests),\n tvl: WrappedBigNumber.from(p.tvl),\n volume24hUsd: WrappedBigNumber.from(p.volume24hUsd),\n tvlUsd: WrappedBigNumber.from(p.tvlUsd),\n effectLiqTvl: WrappedBigNumber.from(p.effectLiqTvl),\n openInterestsUsd: WrappedBigNumber.from(p.openInterestsUsd),\n isInverse,\n longOi: WrappedBigNumber.from(p.longOi),\n shortOi: WrappedBigNumber.from(p.shortOi),\n _1hPeriodsFunding: {\n long: WrappedBigNumber.from(p._1hPeriodsFunding.long),\n short: WrappedBigNumber.from(p._1hPeriodsFunding.short),\n },\n _1hLastFunding: {\n long: WrappedBigNumber.from(p._1hLastFunding.long),\n short: WrappedBigNumber.from(p._1hLastFunding.short),\n },\n poolFee24h: WrappedBigNumber.from(p.poolFee24h),\n };\n }\n return null;\n};\n\nexport const fetchFuturesPairOrderBook = debounceRequest(\n async ({\n chainId,\n address,\n expiry,\n sdk,\n }: {\n chainId: number;\n address: string;\n expiry: number;\n sdk: Context;\n }): Promise => {\n const res = await axiosGet({\n url: 'https://api.synfutures.com/v3/public/perp/market/orderBook',\n config: { params: { chainId, address, expiry } },\n });\n\n if (res?.data?.data) {\n const data = bigNumberObjectCheck(res.data.data);\n const newData = _.reduce(\n data,\n (acc, depth, key) => {\n depth.tick2Pearl = _.reduce(\n depth.tick2Pearl,\n (acc, value, key) => {\n acc.set(Number(key), { liquidityNet: value[0], left: value[1] });\n return acc;\n },\n new Map() as Map,\n );\n\n const depthData = sdk.perpDataSource.depth.getDepthDataByLiquidityDetails(\n depth,\n depth.size,\n depth.tickDelta,\n // depth?.isInverse,\n );\n if (depth.isInverse) {\n const temp = depthData.left;\n depthData.left = depthData.right.map((d) => {\n return { ...d, price: getAdjustTradePrice(d.price, depth.isInverse).toNumber() };\n });\n depthData.right = temp.map((d) => {\n return { ...d, price: getAdjustTradePrice(d.price, depth.isInverse).toNumber() };\n });\n }\n\n acc[key] = depthData;\n return acc;\n },\n {} as Record,\n );\n\n return newData;\n }\n return null;\n },\n 0,\n);\n\nexport const fetchFuturesPairDepthChart = debounceRequest(\n async ({\n chainId,\n address,\n expiry,\n sdk,\n }: {\n chainId: number;\n address: string;\n expiry: number;\n sdk: Context;\n }): Promise => {\n const res = await axiosGet({\n url: 'https://api.synfutures.com/v3/public/perp/market/depth',\n config: { params: { chainId, address, expiry } },\n });\n if (res?.data?.data) {\n const data = bigNumberObjectCheck(res.data.data);\n data.tick2Pearl = _.reduce(\n data.tick2Pearl,\n (acc, value, key) => {\n acc.set(Number(key), { liquidityNet: value[0], left: value[1] });\n return acc;\n },\n new Map() as Map,\n );\n\n const newData = sdk.perpDataSource.depth.getDepthRangeDataByLiquidityDetails(\n data,\n data.size,\n data.stepRatio,\n data?.isInverse,\n );\n if (data.isInverse) {\n const temp = newData.left;\n newData.left = newData.right.map((d) => {\n return { ...d, price: getAdjustTradePrice(d.price, data.isInverse).toNumber() };\n });\n newData.right = temp.map((d) => {\n return { ...d, price: getAdjustTradePrice(d.price, data.isInverse).toNumber() };\n });\n }\n\n return newData;\n }\n return null;\n },\n 0,\n);\n\nexport const fetchFuturesPairFundingChart = debounceRequest(\n async ({\n chainId,\n address,\n expiry,\n chartDuration,\n }: {\n chainId: number;\n address: string;\n expiry: number;\n chartDuration: FundingChartInterval;\n }): Promise => {\n const res = await axiosGet({\n url: 'https://api.synfutures.com/v3/public/perp/market/funding',\n config: { params: { chainId, address, expiry, type: chartDuration } },\n });\n\n if (res?.data?.data) {\n const dataSource: IFundingChart[] = res?.data?.data.map((d: IFuturesFundingRateData) => {\n return {\n ...d,\n };\n });\n // if (pair.isInverse) {\n // dataSource = dataSource.map((d) => {\n // return { ...d, longFundingRate: d.shortFundingRate, shortFundingRate: d.longFundingRate };\n // });\n // }\n return dataSource.map((d) => {\n const isLongPay = d.longFundingRate < 0;\n return {\n ...d,\n payRate: WrappedBigNumber.from(isLongPay ? d.longFundingRate : d.shortFundingRate),\n receiveRate: WrappedBigNumber.from(isLongPay ? d.shortFundingRate : d.longFundingRate),\n isLongPay: isLongPay,\n };\n });\n }\n return null;\n },\n 0,\n);\n\nexport const fetchFuturesPairKlineChart = debounceRequest(\n async ({\n chainId,\n instrumentAddr,\n expiry,\n chartDuration,\n timeEnd,\n }: {\n chainId: number;\n instrumentAddr: string;\n expiry: number;\n chartDuration: KlineInterval;\n timeEnd?: number;\n }): Promise => {\n timeEnd = timeEnd || Math.floor(Date.now() / 1000);\n // fetch 1 more minute data to avoid the last candle tick error\n let utcEnd = moment(timeEnd * 1000).second(0);\n const utcNow = moment(timeEnd * 1000);\n let startTs = utcNow.unix();\n const TIME_NUMBERS = 120;\n if (chartDuration === KlineInterval.DAY) {\n startTs = utcNow.add(-TIME_NUMBERS, 'day').unix();\n utcEnd = utcEnd.add(1, 'day');\n } else if (chartDuration === KlineInterval.WEEK) {\n startTs = utcNow.add(-TIME_NUMBERS * 7, 'day').unix();\n utcEnd = utcEnd.add(7, 'day');\n } else if (chartDuration === KlineInterval.MINUTE) {\n startTs = utcNow.add(-TIME_NUMBERS, 'minutes').unix();\n utcEnd = utcEnd.add(1, 'minutes');\n } else if (chartDuration === KlineInterval.FIVE_MINUTE) {\n startTs = utcNow.add(-TIME_NUMBERS * 5, 'minutes').unix();\n utcEnd = utcEnd.add(5, 'minutes');\n } else if (chartDuration === KlineInterval.FIFTEEN_MINUTE) {\n startTs = utcNow.add(-TIME_NUMBERS * 15, 'minutes').unix();\n utcEnd = utcEnd.add(15, 'minutes');\n } else if (chartDuration === KlineInterval.THIRTY_MINUTE) {\n startTs = utcNow.add(-TIME_NUMBERS * 30, 'minutes').unix();\n utcEnd = utcEnd.add(30, 'minutes');\n } else if (chartDuration === KlineInterval.HOUR) {\n startTs = utcNow.add(-TIME_NUMBERS, 'hours').unix();\n utcEnd = utcEnd.add(1, 'hours');\n } else if (chartDuration === KlineInterval.FOUR_HOUR) {\n startTs = utcNow.add(-TIME_NUMBERS * 4, 'hours').unix();\n utcEnd = utcEnd.add(4, 'hours');\n }\n\n const endTs = utcEnd.unix();\n\n const res = await axiosGet({\n url: `https://api.synfutures.com/v3/public/perp/market/kline`,\n config: {\n params: {\n chainId,\n instrument: instrumentAddr,\n expiry,\n interval: chartDuration,\n startTs,\n endTs,\n },\n },\n });\n let data = res?.data?.data;\n\n // remove the last tick with 0 volume\n if (data.length && data.length >= 2) {\n const last = data[data.length - 1];\n if (last.baseVolume === 0) {\n data = data.slice(0, data.length - 1);\n }\n }\n return data;\n },\n 0,\n);\n","export enum SUBSCRIBE_TYPE {\n MARKET = 'sub_market',\n VAULT = 'sub_vault',\n EVENT = 'sub_event',\n PAIR_INFO = 'sub_pair_info',\n}\n\nexport enum UNSUBSCRIBE_TYPE {\n MARKET = 'un_sub_market',\n VAULT = 'un_sub_vault',\n EVENT = 'un_sub_event',\n PAIR_INFO = 'un_sub_pair_info',\n}\n\nexport enum MESSAGE_TYPE {\n //default\n sdkConfigChanged = 'sdkConfigChanged',\n dappConfigChanged = 'dappConfigChanged',\n blockNumberChanged = 'blockNumberChanged',\n //MARKET\n marketListChanged = 'marketListChanged',\n vaultChanged = 'vaultChanged',\n marketFeaturePairsUpdated = 'marketFeaturePairsUpdated',\n //EVENT with chainId\n perpEvent = 'perpEvent',\n //pair info with chainId+address\n pairInfo = 'pairInfo',\n}\n\nexport interface ISocketBlockInfo {\n chainId: number;\n blockNum: number;\n blockTime: number;\n}\n\nexport type ISocketPerpEventResult = {\n chainId: number;\n event: ISocketPerpEvent[];\n};\n\nexport interface ISocketPerpEvent {\n chainId: number;\n txHash: string;\n txIndex: number;\n logIndex: number;\n contractAddress: string;\n contractType: 'instrument' | 'gate';\n eventName: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n eventArgs: any;\n blockNum?: number;\n}\n","import './initWorker';\n\nimport { CHAIN_ID, Context, TokenInfo as Token } from '@derivation-tech/context';\nimport { DefaultEthGasEstimator, txPlugin } from '@derivation-tech/tx-plugin';\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { BaseContract, BigNumber, ethers } from 'ethers';\nimport _, { debounce } from 'lodash';\n\nimport { DAPP_CHAIN_CONFIGS } from '@/constants/chain';\nimport { POLLING_INSTRUMENT_SPOT_RAW_PRICE } from '@/constants/polling';\nimport { ISpotState } from '@/types/spot';\n// import { fixBalanceNumberDecimalsTo18 } from '@/utils/token';\n// import { pollingFunc } from '@/utils';\n// import { emitWorkerEvent } from './helper';\nimport {\n BlockyResult,\n WorkerDispatchGateEventResult,\n WorkerDispatchInstrumentEventResult,\n WorkerDispatchPortfolioEventResult,\n WorkerEvent,\n // WorkerFuturesListResult,\n WorkerEventNames,\n WorkerFuturesResult,\n WorkerGateBalanceResult,\n WorkerInstrumentSpotRawPriceMapResult,\n WorkerInstrumentSpotStateMapResult,\n WorkerMarketPairInfoResult,\n WorkerOnInstrumentOrderUpdateResult,\n WorkerPortfolioResult,\n} from '@/types/worker';\nimport { bigNumberObjectCheck, pollingFunc } from '@/utils';\nimport { reducePortfolio } from '@/utils/portfolio';\nimport { reduceFuturesForWorker } from '@/utils/worker';\n\nimport { ChainContextWorker } from './ChainContextWorker';\n// import { BlockInfo } from '@derivation-tech/context';\nimport {\n Amm,\n FetchInstrumentParam,\n Instrument,\n MarketType,\n NATIVE_TOKEN_ADDRESS,\n Order,\n PERP_EXPIRY,\n Portfolio,\n Position,\n Range,\n} from '@synfutures/sdks-perp';\nimport { Instrument as InstrumentContract, Instrument__factory } from '@synfutures/sdks-perp/dist/typechain';\n\nimport { vaultConfig } from '@/constants/launchpad/vault';\nimport { SPOT_HISTORY_GRAPH } from '@/constants/spot';\nimport SocketService from '@/entities/SocketService';\nimport { fetchFuturesInstrument, fetchFuturesPairInfo } from '@/features/futures/api';\nimport { IFuturesInstrument } from '@/types/futures';\nimport { IMarketPair } from '@/types/pair';\n\nimport {\n ISocketPerpEvent,\n ISocketPerpEventResult,\n MESSAGE_TYPE,\n SUBSCRIBE_TYPE,\n UNSUBSCRIBE_TYPE,\n} from '@/types/socket';\nimport { aggregatorPlugin as aggregatorPlugin3 } from '@synfutures/sdks-aggregator';\nimport { aggregatorDataSourcePlugin as aggregatorDataSourcePlugin3 } from '@synfutures/sdks-aggregator-datasource';\nimport { perpPlugin } from '@synfutures/sdks-perp';\nimport { perpDataSourcePlugin } from '@synfutures/sdks-perp-datasource';\nimport { perpLaunchpadPlugin } from '@synfutures/sdks-perp-launchpad';\nimport { perpLaunchpadDataSourcePlugin } from '@synfutures/sdks-perp-launchpad-datasource';\nimport { emitWorkerEvent } from './helper';\n\nconst DEBOUNCE_API_TIME = 300;\n\nconst CALL_API_ON_WORKER = false;\n\nexport class ChainSynWorker {\n private static instances: Record = {};\n chainId: CHAIN_ID;\n chainContextWorker: ChainContextWorker;\n sdk?: Context;\n socketInstance: SocketService;\n\n instrumentMap: BlockyResult>; // instrument address => instrument\n\n instrumentSpotStateMap: { [instrumentAddr: string]: BlockyResult }; // instrument address => spot state\n\n gateBalanceMap: { [userAddr: string]: { [quoteAddr: string]: BlockyResult } }; // user address => quote => gate balance\n\n instrumentSpotRawPriceMap: { [instrumentAddr: string]: BlockyResult }; // instrument address => raw price\n\n portfolioMap: {\n [userAddr: string]: { [instrumentAddr: string]: { [expiry: number]: BlockyResult } };\n }; // user address => futures address => expiry => portfolio\n\n listeningEvent: { [contractName: string]: { [listeningKey: string]: boolean } }; // contractName => listeningKey(user address/token address) => listening\n\n instrumentContractMap: { [instrumentAddr: string]: InstrumentContract };\n\n marketPairInfo: { [pairId: string]: IMarketPair } = {};\n\n isRequestPair: {\n [pairId: string]: {\n [block: number]: boolean;\n };\n } = {};\n\n isRequestPortfolio: {\n [portfolioId: string]: {\n [block: number]: boolean;\n };\n } = {};\n\n isRequestBalance: {\n [userAddr: string]: {\n [tokenAddr: string]: {\n [block: number]: boolean;\n };\n };\n } = {};\n pollingTimers: { [key: string]: NodeJS.Timeout } = {};\n\n private blockNumberCache: { blockNumber: number; timestamp: number } | null = null;\n private readonly cacheDuration: number;\n watcherInstrumentAddr?: string;\n watcherAddr?: string;\n\n constructor(chainId: CHAIN_ID, cacheDuration = 500) {\n this.chainId = chainId;\n this.chainContextWorker = ChainContextWorker.getInstance(chainId);\n\n this.instrumentMap = {\n block: 0,\n data: {},\n };\n this.gateBalanceMap = {};\n this.listeningEvent = {};\n this.instrumentContractMap = {};\n this.portfolioMap = {};\n this.instrumentSpotStateMap = {};\n this.instrumentSpotRawPriceMap = {};\n this.cacheDuration = cacheDuration;\n this.socketInstance = this.initSocketInstance();\n }\n\n private async initSDK(chainId: CHAIN_ID) {\n const dappConfig = DAPP_CHAIN_CONFIGS[chainId];\n const vaultGraphAddr = (\n vaultConfig.chainConfig as unknown as {\n [id in CHAIN_ID]?: {\n chainId: number;\n tokens: string[];\n graphAddr: string;\n };\n }\n )[chainId]?.graphAddr;\n\n const ctx = new Context(chainId)\n .use(perpPlugin({ inverse: true }))\n .use(txPlugin({ gasLimitMultiple: 1.7, gasEstimator: new DefaultEthGasEstimator() }))\n .use(\n perpDataSourcePlugin({ endpoint: dappConfig.subgraph, inverse: true }), // dataSourcePlugin\n )\n .use(perpLaunchpadPlugin()) // vaultPlugin\n .use(perpLaunchpadDataSourcePlugin(vaultGraphAddr || '')) // vaultDataSourcePlugin\n .use(aggregatorPlugin3())\n .use(\n aggregatorDataSourcePlugin3(SPOT_HISTORY_GRAPH), // aggregatorDataSourcePlugin\n );\n ctx.setProvider(this.provider);\n await ctx.init();\n return ctx;\n }\n\n async init(): Promise {\n await this.chainContextWorker.readProviderFromLocalOrSetting();\n this.sdk = await this.initSDK(this.chainId);\n this.sdk.setProvider(this.provider);\n }\n\n public static async getInstance(chainId: CHAIN_ID): Promise {\n let instance = this.instances[chainId];\n if (!instance) {\n instance = new ChainSynWorker(chainId);\n this.instances[chainId] = instance;\n await instance.init();\n }\n\n return instance;\n }\n\n get chainContext(): Context {\n return this.chainContextWorker.chainContext;\n }\n\n get provider(): JsonRpcProvider {\n return this.chainContextWorker.provider;\n }\n\n async getBlockNumber(): Promise {\n const now = Date.now();\n\n // Check if the cache is valid\n if (this.blockNumberCache && now - this.blockNumberCache.timestamp < this.cacheDuration) {\n return this.blockNumberCache.blockNumber;\n }\n\n // If the cache is not valid, request the block number\n const blockNumber = await this.provider.getBlockNumber();\n\n // Update the cache\n this.blockNumberCache = {\n blockNumber,\n timestamp: now,\n };\n\n return blockNumber;\n }\n\n /**\n * Retrieves all futures from the chain.\n *\n * @param block - The block number to fetch futures from. If not provided, the latest block number will be used.\n * @returns A promise that resolves to a `BlockyResult` containing a record of futures indexed by their addresses and the block number.\n */\n async getAllFuturesFromChain(block?: number): Promise> | undefined> {\n if (!block) {\n block = await this.getBlockNumber();\n }\n if (!this.sdk) return;\n const futuresList = await this.sdk.perp.observer.getAllInstruments({ blockTag: block });\n if (futuresList.length > 0) {\n const futuresItem = futuresList[0];\n\n // if the block height is lower than the current block height, we don't need to update the state\n if ((futuresItem.blockInfo?.height || 0) < this.instrumentMap.block) {\n return this.instrumentMap;\n }\n block = futuresItem.blockInfo?.height || 0;\n }\n\n const futuresMap = futuresList.reduce((acc, futures) => {\n acc[futures.instrumentAddr.toLowerCase()] = futures;\n return acc;\n }, {} as Record);\n this.instrumentMap = { data: futuresMap, block };\n return { data: futuresMap, block };\n }\n\n /**\n * Retrieves an instrument from the chain.\n *\n * @param instrumentAddr - The address of the instrument.\n * @param expiry - The expiry of the instrument (optional).\n * @param block - The block number (optional).\n * @returns A promise that resolves to a `BlockyResult` containing the instrument model or `undefined`.\n */\n async getInstrumentFromChain(\n instrumentAddr: string,\n expiry?: number,\n block?: number,\n ): Promise> {\n if (!block) {\n block = await this.getBlockNumber();\n }\n\n if (block) {\n // if the pair is already requested, block this request\n const isRequest = _.get(this.isRequestPair, [`${instrumentAddr}-${expiry}`.toLowerCase(), block]);\n if (!isRequest) {\n _.set(this.isRequestPair, [`${instrumentAddr}-${expiry}`.toLowerCase(), block], true);\n } else {\n return { data: undefined, block };\n }\n }\n\n if (this.sdk) {\n const instrumentList = await this.sdk.perp.observer.getInstrument(\n [\n {\n instrument: instrumentAddr,\n expiries: expiry ? [expiry] : [],\n },\n ],\n { blockTag: block },\n );\n if (instrumentList.length > 0) {\n const futuresItem = instrumentList[0];\n const cachedFuturesItem = _.get(this.instrumentMap, ['data', instrumentAddr]);\n // if the block height is lower than the current block height, we don't need to update the state\n if ((futuresItem.blockInfo?.height || 0) < this.instrumentMap.block) {\n return {\n data: cachedFuturesItem,\n block: this.instrumentMap.block,\n };\n }\n block = futuresItem.blockInfo?.height || 0;\n\n // if futures changed, emit event\n this.updateInstrumentCache(futuresItem, block);\n\n return {\n data: futuresItem,\n block,\n };\n }\n }\n return { data: undefined, block: block || 0 };\n }\n\n async batchInstrumentFromChain(\n params: FetchInstrumentParam[],\n block?: number,\n ): Promise> {\n if (!block) {\n block = await this.getBlockNumber();\n }\n if (!params?.length) return { data: undefined, block };\n if (block && params?.length) {\n const firstPair = params[0];\n if (firstPair.expiries?.length) {\n // if the pair is already requested, block this request\n const isRequest = _.get(this.isRequestPair, [\n `${firstPair.instrument}-${firstPair.expiries.join('_')}`.toLowerCase(),\n block,\n ]);\n if (!isRequest) {\n _.set(\n this.isRequestPair,\n [`${firstPair.instrument}-${firstPair.expiries.join('_')}`.toLowerCase(), block],\n true,\n );\n } else {\n return { data: undefined, block };\n }\n }\n }\n\n if (this.sdk) {\n const instrumentList = await this.sdk.perp.observer.getInstrument(params, { blockTag: block });\n if (instrumentList.length > 0) {\n instrumentList.forEach((futuresItem) => {\n block = futuresItem.blockInfo?.height || 0;\n\n // if futures changed, emit event\n this.updateInstrumentCache(futuresItem, block);\n });\n\n return {\n data: instrumentList,\n block: this.instrumentMap.block,\n };\n }\n }\n return { data: undefined, block: block || 0 };\n }\n\n /**\n * Retrieves the spot state of an instrument from the blockchain.\n *\n * @param {Object} params - The parameters for retrieving the spot state.\n * @param {string} params.instrumentAddr - The address of the instrument.\n * @param {InstrumentModel} [params.instrument] - The instrument model.\n * @param {MarketType} [params.marketType] - The market type.\n * @param {number} [params.block] - The block number.\n * @returns {Promise} A promise that resolves to undefined.\n */\n async getInstrumentSpotStateFromChain({\n instrumentAddr,\n instrument,\n marketType,\n block,\n }: {\n instrumentAddr: string;\n instrument?: Instrument;\n marketType?: MarketType;\n block?: number;\n }): Promise {\n if (!this.sdk) return;\n if (!block) {\n block = await this.getBlockNumber();\n }\n if (!instrument) {\n instrument = _.get(this.instrumentMap, ['data', instrumentAddr]);\n }\n if (!marketType && instrument) {\n marketType = instrument.market.info.type as MarketType;\n }\n if (!instrument && !marketType) return;\n\n if (marketType) {\n const marketContract = this.sdk.perp.contracts.marketContracts[marketType];\n if (marketContract) {\n const spotState = await marketContract.market.getSpotState(instrumentAddr, { blockTag: block });\n this.updateSpotStateCache(instrumentAddr.toLowerCase(), spotState, block);\n }\n }\n }\n\n /**\n * Retrieves the raw spot price of an instrument from the chain.\n *\n * @param instrument - The instrument for which to retrieve the spot price.\n * @param block - The block number to use for retrieving the spot price. If not provided, the current block number will be used.\n * @returns A promise that resolves to a `BlockyResult` object containing the spot price and the block number, or `undefined` if the spot price is not available.\n */\n async getInstrumentRawSpotPriceFromChain(\n instrument: Instrument,\n block?: number,\n ): Promise | undefined> {\n try {\n if (!this.sdk) return;\n if (!block) {\n block = await this.getBlockNumber();\n }\n const cachedSpotPrice = _.get(this.instrumentSpotRawPriceMap, [instrument.instrumentAddr.toLowerCase()]);\n if (cachedSpotPrice?.block >= block) {\n return { data: cachedSpotPrice.data, block: cachedSpotPrice.block };\n }\n if (instrument) {\n const spotPrice = await this.sdk.perp.observer.getRawSpotPrice({\n marketType: instrument.market.info.type as MarketType,\n baseSymbol: instrument.base,\n quoteSymbol: instrument.quote,\n });\n _.set(this.instrumentSpotRawPriceMap, [instrument.instrumentAddr.toLowerCase()], { data: spotPrice, block });\n emitWorkerEvent(WorkerEventNames.UpdateRawSpotPriceEvent, {\n instrumentSpotRawPriceMap: this.instrumentSpotRawPriceMap,\n block,\n chainId: this.chainId,\n });\n return { data: spotPrice, block };\n }\n } catch (error) {\n console.error('getInstrumentRawSpotPriceFromChain error:', error);\n }\n }\n\n updateInstrumentCache(instrument: Instrument, block: number): void {\n _.set(this.instrumentMap, ['block'], block);\n const instrumentAddr = instrument.instrumentAddr.toLowerCase();\n _.set(this.instrumentMap, ['data', instrumentAddr], instrument);\n const futuresRecord = reduceFuturesForWorker(this.chainId, {\n [instrument.instrumentAddr.toLowerCase()]: instrument,\n });\n\n // if futures changed, emit event\n emitWorkerEvent(WorkerEventNames.UpdateFuturesEvent, {\n futures: instrument,\n block,\n chainId: this.chainId,\n pairList: Array.from(instrument?.amms.values() || []),\n futuresRecord,\n });\n }\n\n updatePairCache(instrumentAddr: string, amm: Amm): void {\n const cachedFuturesItem = _.get(this.instrumentMap, ['data', instrumentAddr]);\n if (cachedFuturesItem) {\n const expiry = amm.expiry;\n cachedFuturesItem.amms.set(expiry, amm);\n }\n }\n\n updateSpotStateCache(instrumentAddr: string, spotState: ISpotState, block: number): void {\n spotState = bigNumberObjectCheck({\n raw: spotState.raw,\n spot: spotState.spot,\n time: spotState.time,\n });\n const cachedSpotState = _.get(this.instrumentSpotStateMap, [instrumentAddr]);\n if (!cachedSpotState) {\n _.set(this.instrumentSpotStateMap, [instrumentAddr, 'data'], spotState);\n _.set(this.instrumentSpotStateMap, [instrumentAddr, 'block'], block);\n } else {\n if (cachedSpotState.block < block) {\n _.set(this.instrumentSpotStateMap, [instrumentAddr, 'data'], spotState);\n _.set(this.instrumentSpotStateMap, [instrumentAddr, 'block'], block);\n }\n }\n // if futures changed, emit event\n emitWorkerEvent(WorkerEventNames.UpdateSpotStateEvent, {\n instrumentSpotStateMap: this.instrumentSpotStateMap,\n block,\n chainId: this.chainId,\n });\n }\n\n async getPortfolio({\n userAddr,\n instrumentAddr,\n expiry,\n block,\n }: {\n userAddr: string;\n instrumentAddr: string;\n expiry: number;\n block?: number;\n }): Promise | undefined> {\n try {\n if (!this.sdk) return;\n // if (!block) {\n // block = await this.getBlockNumber();\n // }\n if (!instrumentAddr || !expiry) return;\n\n // if account is already requested, block this request\n const isRequest = _.get(this.isRequestPair, [\n `${userAddr}-${instrumentAddr}-${expiry}`.toLowerCase(),\n block || 0,\n ]);\n if (!isRequest) {\n _.set(this.isRequestPair, [`${userAddr}-${instrumentAddr}-${expiry}`.toLowerCase(), block || 0], true);\n } else {\n return undefined;\n }\n\n const portfolio = await this.sdk.perp.observer.getPortfolio(\n { traderAddr: userAddr, instrumentAddr, expiry },\n { blockTag: block },\n );\n // if the block height is lower than the current block height, we don't need to update the state\n const cachedPortfolio = _.get(this.portfolioMap, [userAddr, instrumentAddr, expiry]);\n\n if ((block || 0) < (cachedPortfolio?.block || 0)) {\n return cachedPortfolio;\n }\n // if pair level account changed, emit event\n this.updatePortfolioCache({\n userAddr,\n instrumentAddr,\n expiry,\n portfolio: portfolio,\n block: portfolio.blockInfo?.height || 0,\n });\n } catch (error) {\n console.error(`SynWorker getPortfolio error`, error, {\n userAddr,\n instrumentAddr,\n expiry,\n block,\n });\n }\n }\n /**\n * Retrieves the portfolio list for a given user address.\n *\n * @param userAddr - The user address.\n * @param block - Optional block number.\n * @returns A promise that resolves to a `BlockyResult` containing a record of portfolios indexed by their addresses and the block number.\n */\n async getPortfolioList(\n userAddr: string,\n block?: number,\n needFetchInstruments?: boolean,\n ): Promise> | undefined> {\n try {\n if (!this.sdk) return;\n if (!block) {\n block = await this.getBlockNumber();\n }\n\n // If instrumentMap is empty, fetch all futures from the chain\n if (Object.keys(this.instrumentMap.data).length === 0 || needFetchInstruments) {\n await this.getAllFuturesFromChain(block);\n }\n\n const instruments = Object.keys(this.instrumentMap.data);\n const fetchParams = instruments.map((instrumentAddr) => ({\n traderAddr: userAddr,\n instrumentAddr,\n expiry: PERP_EXPIRY, // Assuming perpetual expiry for all instruments\n }));\n\n let portfolioList = await this.sdk.perp.observer.getPortfolio(fetchParams, { blockTag: block });\n if (portfolioList && (portfolioList as unknown as Portfolio)?.instrumentAddr) {\n portfolioList = [portfolioList as unknown as Portfolio];\n }\n if (portfolioList.length > 0) {\n const portfolioItem = portfolioList[0];\n block = portfolioItem.blockInfo?.height || 0;\n }\n\n portfolioList.forEach((portfolio) => {\n const instrumentAddr = portfolio.instrumentAddr.toLowerCase();\n const expiry = portfolio.expiry;\n // if the block height is lower than the current block height, we don't need to update the state\n const cachedPortfolio = _.get(this.portfolioMap, [userAddr, instrumentAddr, expiry]);\n\n if ((block || 0) < (cachedPortfolio?.block || 0)) {\n return;\n }\n // if pair level account changed, emit event\n this.updatePortfolioCache({\n userAddr,\n instrumentAddr,\n expiry,\n portfolio: portfolio,\n block: block || portfolio.blockInfo?.height || 0,\n });\n });\n\n const portfolioMap = portfolioList.reduce((acc, portfolio) => {\n acc[portfolio.instrumentAddr.toLowerCase()] = portfolio;\n return acc;\n }, {} as Record);\n return { data: portfolioMap, block };\n } catch (error) {\n console.error('getPortfolioList error:', error);\n }\n }\n\n updatePortfolioCache({\n userAddr,\n instrumentAddr,\n expiry,\n portfolio: portfolio,\n block,\n }: {\n userAddr: string;\n instrumentAddr: string;\n expiry: number;\n portfolio: Portfolio;\n block: number;\n }): void {\n if (!portfolio) return;\n\n _.set(this.portfolioMap, [userAddr, instrumentAddr, expiry, 'block'], block);\n\n _.set(this.portfolioMap, [userAddr, instrumentAddr, expiry, 'data'], portfolio);\n\n const reducedPortfolio = reducePortfolio(this.chainId, userAddr, instrumentAddr, portfolio);\n\n // if pair level account changed, emit event\n emitWorkerEvent(WorkerEventNames.UpdatePortfolioEvent, {\n reducedPortfolio,\n block,\n chainId: this.chainId,\n userAddr,\n instrumentAddr,\n expiry,\n });\n }\n\n //TODO: remove unused function\n updatePositionCache({\n userAddr,\n instrumentAddr,\n expiry,\n position,\n }: {\n userAddr: string;\n instrumentAddr: string;\n expiry: number;\n position: Position;\n }): void {\n const cachedPortfolio = _.get(this.portfolioMap, [userAddr, instrumentAddr, expiry, 'data']);\n if (cachedPortfolio) {\n cachedPortfolio.position = position;\n }\n }\n //TODO: remove unused function\n updateOrderCache({\n userAddr,\n instrumentAddr,\n expiry,\n order,\n }: {\n userAddr: string;\n instrumentAddr: string;\n expiry: number;\n order: Order;\n }): void {\n const cachedPortfolio = _.get(this.portfolioMap, [userAddr, instrumentAddr, expiry, 'data']);\n if (cachedPortfolio) {\n if (!cachedPortfolio.orders) {\n cachedPortfolio.orders = new Map();\n }\n cachedPortfolio.orders.set(order.oid, order);\n }\n }\n //TODO: remove unused function\n updateRangeCache(userAddr: string, instrumentAddr: string, expiry: number, range: Range): void {\n const cachedPortfolio = _.get(this.portfolioMap, [userAddr, instrumentAddr, expiry, 'data']);\n if (cachedPortfolio) {\n if (!cachedPortfolio.ranges) {\n cachedPortfolio.ranges = new Map();\n }\n cachedPortfolio.ranges.set(range.rid, range);\n }\n }\n\n /**\n * Retrieves the gate balance from the chain for a given user address and tokens.\n *\n * @param userAddr - The user address.\n * @param tokens - An array of tokens.\n * @param block - Optional block number.\n * @returns A promise that resolves to an object containing the token balances and block number, or undefined.\n */\n async getGateBalanceFromChain(\n userAddr: string,\n tokens: Token[],\n block?: number,\n ): Promise<\n | BlockyResult<\n {\n token: Token;\n balance: BigNumber;\n block: number;\n }[]\n >\n | undefined\n > {\n if (!this.sdk) return;\n if (tokens.length === 0) {\n return;\n }\n\n if (!block) {\n block = await this.getBlockNumber();\n }\n if (tokens.length === 1) {\n // if the balance is already requested, block this request\n const token = tokens[0];\n const isRequest = _.get(this.isRequestBalance, [userAddr, token.address, block]);\n if (!isRequest) {\n _.set(this.isRequestBalance, [userAddr, token.address, block], true);\n } else {\n return undefined;\n }\n }\n\n tokens = tokens.map((token) =>\n token.address.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase() ? this.chainContext.wrappedNativeToken : token,\n );\n\n const quotes = tokens.map((t) => t.address);\n\n const [balances, blockInfo] = await this.sdk.perp.contracts.observer.getVaultBalances(userAddr, quotes, {\n blockTag: block,\n });\n if (blockInfo) {\n block = blockInfo[1];\n }\n tokens.forEach((token, index) => {\n const tokenAddress = token.address.toLowerCase();\n const balance = balances[index];\n // // if the block height is lower than the current block height, we don't need to update the state\n const cachedBalanceInfo = this.gateBalanceMap[userAddr]?.[token.address];\n\n // if balance changed, emit event\n if (!balance.eq(cachedBalanceInfo?.data || -1)) {\n emitWorkerEvent(WorkerEventNames.UpdateGateBalanceEvent, {\n gateBalance: balance,\n chainId: this.chainId,\n userAddr: userAddr,\n token: { ...token, address: tokenAddress },\n block: block || 0,\n });\n }\n _.set(this.gateBalanceMap, [userAddr, tokenAddress], { block, data: balance });\n });\n\n return {\n block: block || 0,\n data: tokens.map((token, index) => {\n return {\n token: { ...token, address: token.address.toLowerCase() },\n balance: balances[index],\n block: block || 0,\n };\n }),\n };\n }\n\n async getToken(tokenAddr: string): Promise {\n if (tokenAddr.toLowerCase() === NATIVE_TOKEN_ADDRESS.toLowerCase()) return this.chainContext.wrappedNativeToken;\n const cachedToken = this.chainContext.info.erc20.find(\n (token) => token.address?.toLowerCase() === tokenAddr.toLowerCase(),\n );\n if (cachedToken) return { ...cachedToken, address: cachedToken.address.toLowerCase() };\n\n const token = await this.chainContext.getTokenInfo(tokenAddr);\n if (token) {\n return {\n ...token,\n address: token.address?.toLowerCase(),\n };\n }\n return token;\n }\n\n /**\n * watch vault contract deposit/withdraw/adjustMargin event\n * @param userAddr\n * @param token\n */\n WatchGateContract(userAddr: string): void {\n if (!this.sdk) return;\n const gateContract = this.sdk.perp.contracts.gate;\n const chainId = this.chainId;\n\n if (this.listeningEvent['gate']?.[`${chainId}-${userAddr}`.toLowerCase()]) {\n return;\n }\n\n _.set(this.listeningEvent, ['gate', `${chainId}-${userAddr}`.toLowerCase()], true);\n\n (gateContract as unknown as BaseContract).once(\n {\n topics: [\n [\n // has trader's event\n gateContract.interface.getEventTopic('Deposit'),\n gateContract.interface.getEventTopic('Withdraw'),\n gateContract.interface.getEventTopic('Scatter'),\n gateContract.interface.getEventTopic('Gather'),\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n null as any,\n ethers.utils.hexZeroPad(userAddr, 32),\n ],\n },\n async (event) => {\n const parsedLog = gateContract.interface.parseLog(event);\n\n const quote = parsedLog.args.quote;\n const trader = parsedLog.args.trader?.toLowerCase();\n\n const token = await this.getToken(quote);\n console.log('gateContract event:', parsedLog.name, 'args:', parsedLog.args, token, trader);\n token && trader && this.getGateBalanceFromChain(userAddr, [token], event.blockNumber);\n },\n );\n\n (gateContract as unknown as BaseContract).once(\n {\n topics: [[gateContract.interface.getEventTopic('NewInstrument')]],\n },\n async (event) => {\n const parsedLog = gateContract.interface.parseLog(event);\n\n const instrument = parsedLog.args.instrument;\n\n console.log('gateContract event:', parsedLog.name, 'args:', parsedLog.args, instrument);\n\n // TODO: check expiry exist\n const instrumentModel = await this.getInstrumentFromChain(instrument, undefined, event.blockNumber);\n if (instrumentModel.data) {\n this.pollingInstrument(instrumentModel.data?.instrumentAddr.toLowerCase());\n this.batchInstrumentFromChain(\n [\n {\n instrument: instrumentModel.data?.instrumentAddr.toLowerCase(),\n expiries: Array.from(instrumentModel.data.amms.values()).map((amm) => amm.expiry),\n },\n ],\n event.blockNumber,\n );\n }\n },\n );\n }\n\n getInstrumentContract(instrumentAddr: string): InstrumentContract {\n instrumentAddr = instrumentAddr.toLowerCase();\n let instrumentContract = this.instrumentContractMap[instrumentAddr];\n if (!instrumentContract) {\n instrumentContract = Instrument__factory.connect(instrumentAddr, this.provider);\n _.set(this.instrumentContractMap, [instrumentAddr], instrumentContract);\n }\n\n return instrumentContract;\n }\n\n watchInstrumentUpdateContract(instrumentAddr: string): void {\n const instrumentContract = this.getInstrumentContract(instrumentAddr);\n const chainId = this.chainId;\n\n if (this.listeningEvent['instrument']?.[`${chainId}-${instrumentAddr}`.toLowerCase()]) {\n return;\n }\n _.set(this.listeningEvent, ['instrument', `${chainId}-${instrumentAddr}`.toLowerCase()], true);\n\n (instrumentContract as BaseContract).on(\n {\n topics: [\n [\n // instrument event\n instrumentContract.interface.getEventTopic('UpdateAmmStatus'),\n instrumentContract.interface.getEventTopic('UpdateSocialLossInsuranceFund'),\n // instrumentContract.interface.getEventTopic('UpdateFundingIndex'), // PERP_EXPIRY , temp remove for performance\n ],\n ],\n },\n (event) => {\n const parsedLog = instrumentContract.interface.parseLog(event);\n\n const expiry = parsedLog.args.expiry;\n const trader = parsedLog.args.trader?.toLowerCase();\n console.log('watchInstrumentUpdateContract event:', parsedLog.name, 'args:', parsedLog.args, expiry, trader);\n expiry && this.getInstrumentFromChain(instrumentAddr, expiry, event.blockNumber);\n if ('UpdateFundingIndex' === parsedLog.name) {\n this.getInstrumentFromChain(instrumentAddr, PERP_EXPIRY, event.blockNumber);\n }\n },\n );\n }\n\n watchAccountUpdateContact(instrumentAddr: string, userAddr: string): void {\n const instrumentContract = this.getInstrumentContract(instrumentAddr);\n const chainId = this.chainId;\n\n if (this.listeningEvent['instrument']?.[`${chainId}-${instrumentAddr}-${userAddr}`.toLowerCase()]) {\n return;\n }\n _.set(this.listeningEvent, ['instrument', `${chainId}-${instrumentAddr}-${userAddr}`.toLowerCase()], true);\n const eventFilter = {\n topics: [\n [\n // has trader's event\n instrumentContract.interface.getEventTopic('Place'),\n instrumentContract.interface.getEventTopic('Settle'),\n instrumentContract.interface.getEventTopic('Cancel'),\n instrumentContract.interface.getEventTopic('Fill'),\n instrumentContract.interface.getEventTopic('Adjust'),\n instrumentContract.interface.getEventTopic('Trade'),\n instrumentContract.interface.getEventTopic('Sweep'),\n instrumentContract.interface.getEventTopic('Add'),\n instrumentContract.interface.getEventTopic('Remove'),\n instrumentContract.interface.getEventTopic('Liquidate'),\n ],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n null as any,\n ethers.utils.hexZeroPad(userAddr, 32),\n ],\n };\n (instrumentContract as BaseContract).on(eventFilter, (event) => {\n const parsedLog = instrumentContract.interface.parseLog(event);\n\n const expiry = parsedLog.args.expiry;\n const trader = parsedLog.args.trader?.toLowerCase();\n console.log('watchAccountUpdateContact event:', parsedLog.name, 'args:', parsedLog.args, expiry, trader);\n if (trader !== userAddr.toLowerCase()) {\n return;\n }\n expiry && trader && this.getPortfolio({ userAddr: trader, instrumentAddr, expiry, block: event.blockNumber });\n if (['Place', 'Cancel', 'Fill'].includes(parsedLog.name)) {\n if (trader === userAddr.toLowerCase()) {\n // emit event\n emitWorkerEvent(WorkerEventNames.OnInstrumentOrderUpdateEvent, {\n block: event.blockNumber,\n chainId: this.chainId,\n userAddr: trader,\n instrumentAddr,\n expiry,\n eventName: parsedLog.name,\n transactionHash: event.transactionHash,\n // event: event,\n eventArgs: parsedLog.args,\n });\n }\n }\n });\n }\n\n watchSocketEvent(userAddr: string, watcherInstrumentAddr?: string): void {\n const chainId = this.chainId;\n const socket = this.socketInstance;\n if (!socket || !chainId) return;\n this.watcherAddr = userAddr;\n if (watcherInstrumentAddr) this.watcherInstrumentAddr = watcherInstrumentAddr;\n if (socket?.socket && socket?.socket?.hasListeners(MESSAGE_TYPE.perpEvent)) {\n return;\n } else {\n socket.emit(SUBSCRIBE_TYPE.EVENT, { chainId: chainId });\n\n socket.on(MESSAGE_TYPE.perpEvent, (data: ISocketPerpEventResult) => {\n // console.record('socket', MESSAGE_TYPE.perpEvent, data);\n if (data.chainId === chainId) {\n data.event.forEach((event) => {\n this.handleSocketEvent({\n contractAddress: event.contractAddress?.toLowerCase(),\n contractType: event.contractType,\n eventName: event.eventName,\n eventArgs: event.eventArgs,\n blockNum: event.blockNum,\n event,\n });\n });\n }\n });\n }\n }\n\n removeSocketEvent(): void {\n const chainId = this.chainId;\n const socket = this.socketInstance;\n if (!socket || !chainId) return;\n socket.emit(UNSUBSCRIBE_TYPE.EVENT, { chainId: chainId });\n socket.off(MESSAGE_TYPE.perpEvent);\n }\n\n async handleSocketEvent({\n contractAddress,\n contractType,\n eventName,\n eventArgs,\n blockNum,\n event,\n }: {\n contractAddress: string;\n contractType: 'instrument' | 'gate';\n eventName: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n eventArgs: any;\n event: ISocketPerpEvent;\n blockNum?: number;\n }) {\n const userAddr = this.watcherAddr;\n const watcherInstrumentAddr = this.watcherInstrumentAddr;\n const trader = eventArgs?.trader?.toLowerCase();\n\n if (contractType === 'instrument') {\n const expiry = eventArgs?.expiry;\n\n if (['UpdateAmmStatus', 'UpdateSocialLossInsuranceFund'].includes(eventName)) {\n const expiry = eventArgs?.expiry;\n if (watcherInstrumentAddr && watcherInstrumentAddr !== contractAddress) return;\n // contractAddress && expiry && this.getInstrumentFromChain(contractAddress, expiry, blockNum);\n if (contractAddress && expiry) {\n if (CALL_API_ON_WORKER) this.getInstrumentWithFallback({ instrumentAddr: contractAddress, expiry });\n else\n this.dispatchInstrumentUpdateEvent({\n instrumentAddr: contractAddress,\n expiry,\n eventName,\n eventArgs,\n txHash: event.txHash,\n trader,\n });\n }\n\n if ('UpdateFundingIndex' === eventName) {\n // contractAddress && this.getInstrumentFromChain(contractAddress, PERP_EXPIRY, blockNum);\n if (contractAddress) {\n if (CALL_API_ON_WORKER)\n this.getInstrumentWithFallback({ instrumentAddr: contractAddress, expiry: PERP_EXPIRY });\n else\n this.dispatchInstrumentUpdateEvent({\n instrumentAddr: contractAddress,\n expiry: PERP_EXPIRY,\n eventName,\n eventArgs,\n txHash: event.txHash,\n trader,\n });\n }\n }\n } else if (\n ['Place', 'Settle', 'Cancel', 'Fill', 'Adjust', 'Trade', 'Sweep', 'Add', 'Remove', 'Liquidate'].includes(\n eventName,\n )\n ) {\n if (watcherInstrumentAddr && watcherInstrumentAddr !== contractAddress) return;\n\n // also call instrument\n // if (['Trade', 'Add', 'Remove'].includes(eventName))\n\n if (contractAddress && expiry) {\n if (CALL_API_ON_WORKER) this.getInstrumentWithFallback({ instrumentAddr: contractAddress, expiry });\n else\n this.dispatchInstrumentUpdateEvent({\n instrumentAddr: contractAddress,\n expiry,\n eventName,\n eventArgs,\n txHash: event.txHash,\n trader,\n });\n }\n if (!userAddr) return;\n if (trader !== userAddr.toLowerCase()) {\n return;\n }\n console.log('instrumentContact event:', eventName, 'args:', {\n eventArgs,\n expiry,\n trader,\n watcherInstrumentAddr,\n });\n\n if (contractAddress && expiry) {\n if (CALL_API_ON_WORKER)\n this.getPortfolioWithFallback({\n userAddr: trader,\n instrumentAddr: contractAddress,\n expiry,\n });\n else\n expiry &&\n trader &&\n this.dispatchPortfolioUpdateEvent({\n instrumentAddr: contractAddress,\n expiry,\n eventName,\n eventArgs,\n txHash: event.txHash,\n trader,\n });\n }\n\n if (['Place', 'Cancel', 'Fill'].includes(eventName)) {\n if (trader === userAddr.toLowerCase()) {\n // emit event\n emitWorkerEvent(WorkerEventNames.OnInstrumentOrderUpdateEvent, {\n block: blockNum || 0,\n chainId: this.chainId,\n userAddr: trader,\n instrumentAddr: contractAddress,\n expiry,\n eventName: eventName,\n transactionHash: event.txHash,\n // event: event,\n eventArgs,\n });\n }\n }\n }\n } else if (contractType === 'gate') {\n if (eventName === 'NewInstrument') {\n const instrument = eventArgs?.instrument;\n if (!instrument) return;\n // this.getInstrumentFromChain(instrument, undefined, blockNum);\n this.getInstrumentWithFallback({ instrumentAddr: instrument });\n } else {\n if (!userAddr) return;\n const quote = eventArgs?.quote;\n if (userAddr.toLowerCase() !== trader) return;\n const token = await this.getToken(quote);\n console.log('gateContract event:', eventName, 'args:', { eventArgs, trader });\n token && this.getGateBalanceFromChain(userAddr, [token], blockNum);\n this.dispatchGateUpdateEvent({\n eventName,\n eventArgs,\n txHash: event.txHash,\n userAddr: trader,\n token: token,\n block: blockNum || 0,\n });\n }\n }\n }\n\n removeAllInstrumentListeners(): void {\n Object.values(this.instrumentContractMap).forEach((instrumentContract) => {\n instrumentContract.removeAllListeners();\n });\n _.set(this.listeningEvent, ['instrument'], {});\n }\n\n removeAllGateListeners(): void {\n if (this.sdk) {\n const gateContract = this.sdk.perp.contracts.gate;\n gateContract.removeAllListeners();\n _.set(this.listeningEvent, ['gate'], {});\n }\n }\n\n async pollingInstrument(instrumentAddr: string): Promise {\n if (this.pollingTimers[instrumentAddr]) return;\n let instrument = _.get(this.instrumentMap, ['data', instrumentAddr]);\n if (!instrument) {\n const res = await this.getInstrumentFromChain(instrumentAddr);\n if (res.data) instrument = res.data;\n }\n if (instrument) {\n const timer = pollingFunc(() => {\n this.getInstrumentFromChain(instrumentAddr);\n this.getInstrumentRawSpotPriceFromChain(instrument);\n this.getInstrumentSpotStateFromChain({\n instrumentAddr,\n instrument,\n marketType: instrument.market.info.type as MarketType,\n });\n }, POLLING_INSTRUMENT_SPOT_RAW_PRICE);\n\n this.pollingTimers[instrumentAddr] = timer;\n }\n }\n\n initSocketInstance(): SocketService {\n if (this.socketInstance) {\n return this.socketInstance;\n }\n const socketS = SocketService.getInstance();\n const socketInstance = socketS.connect();\n return socketInstance;\n }\n\n /**\n * Retrieves an instrument from the api.\n *\n * @param instrumentAddr - The address of the instrument.\n * @returns A promise that resolves to a `BlockyResult` containing the instrument model or `undefined`.\n */\n getInstrumentWithFallback = debounce(\n async ({\n instrumentAddr,\n expiry,\n }: {\n instrumentAddr: string;\n expiry?: number;\n }): Promise> => {\n try {\n // First try to get from API\n const apiResult = await this.getInstrumentFromApi({ instrumentAddr, expiry });\n if (apiResult?.data) {\n return apiResult;\n }\n throw new Error('API returned no data');\n } catch (apiError) {\n console.warn('API request failed, falling back to chain:', apiError);\n try {\n // If API fails, fall back to chain request\n const chainResult = await this.getInstrumentFromChain(instrumentAddr, expiry);\n return chainResult;\n } catch (chainError) {\n console.error('Both API and chain requests failed:', chainError);\n throw new Error('Failed to fetch instrument from both API and chain');\n }\n }\n },\n DEBOUNCE_API_TIME,\n );\n\n /**\n * Retrieves an instrument from the api.\n *\n * @param instrumentAddr - The address of the instrument.\n * @returns A promise that resolves to a `BlockyResult` containing the instrument model or `undefined`.\n */\n getInstrumentFromApi = debounce(\n async ({\n instrumentAddr,\n }: {\n instrumentAddr: string;\n expiry?: number;\n }): Promise> => {\n // expiry && this.getMarketPairInfoFromApi(instrumentAddr, expiry);\n const instrument = await fetchFuturesInstrument(this.chainId, instrumentAddr);\n if (instrument) {\n const futuresItem = instrument;\n const block = futuresItem.blockInfo?.height || 0;\n\n // if futures changed, emit event\n this.updateInstrumentCache(futuresItem, block);\n\n return {\n data: futuresItem,\n block,\n };\n }\n return { data: undefined, block: 0 };\n },\n DEBOUNCE_API_TIME,\n );\n\n // getPortfolioFromApi = debounce(\n // async ({\n // userAddr,\n // instrumentAddr,\n // expiry,\n // }: {\n // userAddr: string;\n // instrumentAddr?: string;\n // expiry?: number;\n // }): Promise | undefined> => {\n // // expiry && this.getMarketPairInfoFromApi(instrumentAddr, expiry);\n // const portfolioList = await fetchPortfolioListFromApi(this.chainId, userAddr, instrumentAddr, expiry);\n // if (portfolioList?.length) {\n // const portfolioItem = portfolioList[0];\n // const block = portfolioItem.blockInfo?.height || 0;\n\n // // if futures changed, emit event\n // this.updatePortfolioCache({\n // userAddr,\n // instrumentAddr: portfolioItem.instrumentAddr,\n // expiry: portfolioItem.expiry,\n // portfolio: portfolioItem,\n // block,\n // });\n\n // return {\n // data: portfolioItem,\n // block,\n // };\n // }\n // },\n // DEBOUNCE_API_TIME,\n // );\n\n getPortfolioWithFallback = debounce(\n async ({\n userAddr,\n instrumentAddr,\n expiry,\n }: {\n userAddr: string;\n instrumentAddr?: string;\n expiry?: number;\n }): Promise | undefined> => {\n try {\n // TODO: a bug here, worker can't run\n // First try to get from API\n // const apiResult = await this.getPortfolioFromApi({ userAddr, instrumentAddr, expiry });\n // if (apiResult?.data) {\n // return apiResult;\n // }\n throw new Error('API returned no data');\n } catch (apiError) {\n console.warn('API request failed, falling back to chain:', apiError);\n try {\n // If API fails, fall back to chain request\n if (instrumentAddr && expiry) {\n const chainResult = await this.getPortfolio({ userAddr, instrumentAddr, expiry });\n return chainResult;\n }\n } catch (chainError) {\n console.error('Both API and chain requests failed:', chainError);\n throw new Error('Failed to fetch instrument from both API and chain');\n }\n }\n },\n DEBOUNCE_API_TIME,\n );\n\n /**\n * Retrieves an instrument from the api.\n *\n * @param instrumentAddr - The address of the instrument.\n * @returns A promise that resolves to a `BlockyResult` containing the instrument model or `undefined`.\n */\n dispatchInstrumentUpdateEvent = debounce(\n async ({\n instrumentAddr,\n expiry,\n eventName,\n eventArgs,\n txHash,\n trader,\n }: {\n instrumentAddr: string;\n expiry?: number;\n eventName: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n eventArgs: any;\n txHash: string;\n trader?: string;\n }) => {\n emitWorkerEvent(WorkerEventNames.DispatchInstrumentUpdateEvent, {\n instrumentAddr,\n expiry,\n eventName,\n eventArgs,\n transactionHash: txHash,\n chainId: this.chainId,\n trader,\n });\n },\n DEBOUNCE_API_TIME,\n );\n\n dispatchPortfolioUpdateEvent = debounce(\n async ({\n instrumentAddr,\n expiry,\n eventName,\n eventArgs,\n txHash,\n trader,\n }: {\n instrumentAddr: string;\n expiry?: number;\n eventName: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n eventArgs: any;\n txHash: string;\n trader?: string;\n }) => {\n emitWorkerEvent(WorkerEventNames.DispatchPortfolioUpdateEvent, {\n instrumentAddr,\n expiry,\n eventName,\n eventArgs,\n transactionHash: txHash,\n chainId: this.chainId,\n trader,\n });\n },\n DEBOUNCE_API_TIME,\n );\n\n dispatchGateUpdateEvent = debounce(\n async ({\n eventName,\n eventArgs,\n txHash,\n userAddr: userAddr,\n block,\n }: {\n userAddr: string;\n token: Token;\n block: number;\n\n eventName: string;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n eventArgs: any;\n txHash: string;\n }) => {\n emitWorkerEvent(WorkerEventNames.DispatchGateUpdateEvent, {\n eventName,\n eventArgs,\n transactionHash: txHash,\n chainId: this.chainId,\n userAddr: userAddr,\n block,\n });\n },\n DEBOUNCE_API_TIME,\n );\n\n /**\n * Retrieves an instrument from the chain.\n *\n * @param instrumentAddr - The address of the instrument.\n * @param expiry - The expiry of the instrument (optional).\n * @returns A promise that resolves to a `BlockyResult` containing the instrument model or `undefined`.\n */\n getMarketPairInfoFromApi = debounce(\n async (instrumentAddr: string, expiry: number): Promise => {\n const pairInfo = await fetchFuturesPairInfo({ chainId: this.chainId, address: instrumentAddr, expiry });\n if (pairInfo) {\n // this.updatePairInfoCache(instrumentAddr, expiry, pairInfo);\n\n return pairInfo;\n }\n },\n DEBOUNCE_API_TIME,\n );\n\n updatePairInfoCache(instrumentAddr: string, expiry: number, pairInfo: IMarketPair): void {\n const pairId = pairInfo.id;\n\n let isDiff = false;\n const cachedPairInfo = _.get(this.marketPairInfo, [pairId]);\n if (!cachedPairInfo || !_.isEqual(cachedPairInfo, pairInfo)) {\n _.set(this.marketPairInfo, [pairId], pairInfo);\n isDiff = true;\n }\n\n if (isDiff)\n // if futures changed, emit event\n emitWorkerEvent(WorkerEventNames.UpdateMarketPairInfoEvent, {\n pairInfo: pairInfo,\n chainId: this.chainId,\n });\n }\n\n async pollingInstrumentFromApi(instrumentAddr: string): Promise {\n if (this.pollingTimers[instrumentAddr]) return;\n let instrument = _.get(this.instrumentMap, ['data', instrumentAddr]);\n if (!instrument) {\n const res = await this.getInstrumentFromApi({ instrumentAddr });\n if (res?.data) instrument = res.data;\n }\n if (instrument) {\n const timer = pollingFunc(() => {\n this.getInstrumentFromApi({ instrumentAddr });\n }, POLLING_INSTRUMENT_SPOT_RAW_PRICE);\n\n this.pollingTimers[instrumentAddr] = timer;\n }\n }\n}\n\nonmessage = async (e) => {\n try {\n const event = e.data as WorkerEvent;\n if (event.eventName === WorkerEventNames.WatchGateEvent) {\n const { chainId, userAddr } = event.data;\n if (!userAddr) return;\n const worker = await ChainSynWorker.getInstance(chainId);\n _.debounce(() => {\n worker.watchSocketEvent(userAddr);\n }, 300)();\n } else if (event.eventName === WorkerEventNames.UpdateFuturesEvent) {\n const { chainId, instrumentAddr } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (instrumentAddr && worker) {\n // worker.removeAllListeners();\n setTimeout(() => {\n // worker.watchInstrumentUpdateContract(instrumentAddr);\n }, 1000);\n }\n } else if (event.eventName === WorkerEventNames.InstrumentUpdateEvent) {\n const { chainId, userAddr, instrumentAddr } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (instrumentAddr && userAddr && worker) {\n // worker.removeAllListeners();\n _.debounce(() => {\n worker.watchSocketEvent(userAddr?.toLowerCase(), instrumentAddr);\n // worker.watchInstrumentUpdateContract(instrumentAddr);\n // worker.watchAccountUpdateContact(instrumentAddr, userAddr?.toLowerCase());\n }, 300)();\n }\n } else if (event.eventName === WorkerEventNames.FetchPair) {\n // const { chainId, instrumentAddr, expiry } = event.data;\n // const worker = await ChainSynWorker.getInstance(chainId);\n // if (instrumentAddr) {\n // // worker.getInstrumentFromChain(instrumentAddr, expiry, blockNumber);\n // worker.getInstrumentWithFallback({ instrumentAddr, expiry });\n // }\n } else if (event.eventName === WorkerEventNames.BatchPairs) {\n const { chainId, params, blockNumber } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (params && params.length) {\n worker.batchInstrumentFromChain(params, blockNumber);\n }\n } else if (event.eventName === WorkerEventNames.FetchPortfolio) {\n const { chainId, instrumentAddr, expiry, userAddr, blockNumber } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (worker && instrumentAddr && userAddr) {\n worker.getPortfolio({ userAddr, instrumentAddr, expiry, block: blockNumber });\n }\n } else if (event.eventName === WorkerEventNames.FetchPortfolioList) {\n const { chainId, userAddr, blockNumber, needFetchInstruments } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (worker && userAddr) {\n worker.getPortfolioList(userAddr, blockNumber, needFetchInstruments);\n }\n } else if (event.eventName === WorkerEventNames.FetchGateBalance) {\n const { chainId, tokens, userAddr, blockNumber } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (worker && tokens && tokens.length && userAddr) {\n worker.getGateBalanceFromChain(userAddr, tokens, blockNumber);\n }\n } else if (event.eventName === WorkerEventNames.RemoveAllInstrumentEventListener) {\n // const { chainId } = event.data;\n // const worker = await ChainSynWorker.getInstance(chainId);\n // if (chainId && worker) {\n // worker.removeAllInstrumentListeners();\n // }\n } else if (event.eventName === WorkerEventNames.RemoveAllGateEventListener) {\n // const { chainId } = event.data;\n // const worker = await ChainSynWorker.getInstance(chainId);\n // if (chainId && worker) {\n // worker.removeAllGateListeners();\n // }\n } else if (event.eventName === WorkerEventNames.FetchInstrumentSpotState) {\n const { chainId, instrumentAddr, blockNumber, marketType } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (worker && instrumentAddr) {\n worker.getInstrumentSpotStateFromChain({ instrumentAddr, block: blockNumber, marketType });\n }\n } else if (event.eventName === WorkerEventNames.PollingFetchInstrument) {\n const { chainId, instrumentAddr } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (worker && instrumentAddr) {\n // worker.pollingInstrumentFromApi(instrumentAddr);\n }\n } else if (event.eventName === WorkerEventNames.RemoveAllSocketEventListener) {\n const { chainId } = event.data;\n const worker = await ChainSynWorker.getInstance(chainId);\n if (chainId && worker) {\n worker.removeSocketEvent();\n }\n }\n } catch (error) {\n console.error('🚀 ~ file: SynWorker.ts:142 ~ error:', error);\n }\n};\n","import _ from 'lodash';\n\nimport { IInstrumentRecord } from '@/types/pair';\n\nimport { Instrument } from '@synfutures/sdks-perp';\nimport { bigNumberObjectCheck } from '.';\nimport { transformToMetaFutures, transformToMetaPair } from './transform/pair';\n\nexport function reduceFuturesForWorker(chainId: number, futures: Record): IInstrumentRecord {\n const allFutures = _.reduce(\n futures,\n (res, futuresObj) => {\n if (!res.futuresMap) {\n res.futuresMap = {};\n }\n if (!res?.blockInfo?.height) {\n res.blockInfo = futuresObj.blockInfo || {\n height: 0,\n timestamp: 0,\n };\n }\n if (!res.pairMap) {\n res.pairMap = {};\n }\n\n const futuresCore = transformToMetaFutures(futuresObj, chainId);\n res.futuresMap[futuresCore.id] = futuresCore;\n const amms = futuresObj?.amms;\n if (amms) {\n amms.forEach((amm) => {\n const pairId = `${futuresObj.instrumentAddr}-${amm.expiry}`.toLowerCase();\n const pairCore = transformToMetaPair({\n amm: amm,\n futures: futuresObj,\n blockInfo: amm.blockInfo,\n });\n res.pairMap[pairId] = pairCore;\n });\n }\n return bigNumberObjectCheck(res);\n },\n {} as IInstrumentRecord,\n );\n allFutures.chainId = chainId;\n return allFutures;\n}\n","export const MARKET_PAGE_POLLING_INTERVAL = 5000;\nexport const TRADE_PAGE_POLLING_INTERVAL = 5000;\nexport const IP_POLLING_INTERVAL = 5000;\nexport const PORTFOLIO_PAGE_POLLING_INTERVAL = 5000;\nexport const POLLING_ORDER_BOOK = 15000;\nexport const POLLING_INSTRUMENT_SPOT_RAW_PRICE = 5000;\nexport const POLLING_USER_PENDING_WITHDRAWABLE = 15000;\nexport const POLLING_USER_BALANCE = 5000;\nexport const POLLING_GRAPH = 15000;\nexport const POLLING_OPEN_ORDER_CREATE_TIME = 10000;\nexport const POLLING_HISTORY_POLLING = 10 * 1000;\nexport const POLLING_HISTORY_POLLING_DELAY = 5 * 1000;\nexport const POLLING_BLOCK_NUMBER = 3000;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = function() {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [289,24,284,861,717,886,563,159,975,682,913,241,729,592], function() { return __webpack_require__(5727); })\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","__webpack_require__.amdO = {};","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + {\"24\":\"antd\",\"159\":\"vendor~efdee510\",\"241\":\"vendor~229eafb5\",\"284\":\"vendor~cdd60c62\",\"289\":\"custom\",\"563\":\"vendor~d2eb5610\",\"592\":\"common\",\"682\":\"vendor~37d53f5a\",\"717\":\"vendor~820c4f04\",\"729\":\"vendor~a5ce148e\",\"861\":\"vendor~db2560e8\",\"886\":\"vendor~7f854005\",\"913\":\"vendor~5a94f17d\",\"975\":\"vendor~9241dc7c\"}[chunkId] + \".\" + {\"24\":\"010bab0a\",\"159\":\"e36bb9cd\",\"241\":\"e9003480\",\"284\":\"1277de48\",\"289\":\"9dc2d734\",\"563\":\"457e2d97\",\"592\":\"711fad65\",\"682\":\"6e6f9f6c\",\"717\":\"16f25bd6\",\"729\":\"245f9105\",\"861\":\"903114f2\",\"886\":\"55fc9c15\",\"913\":\"1c2e413f\",\"975\":\"d7a29324\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/css/\" + \"custom\" + \".\" + \"ac13e4fb\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.j = 665;","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t665: 1\n};\n\n// importScripts chunk loading\nvar installChunk = function(data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = function(chunkId, promises) {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunk_synfutures_v3_app\"] = self[\"webpackChunk_synfutures_v3_app\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","__webpack_require__.nc = undefined;","var next = __webpack_require__.x;\n__webpack_require__.x = function() {\n\treturn Promise.all([289,24,284,861,717,886,563,159,975,682,913,241,729,592].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["negativeNumberColor","num","toBN","gte","DisplayStrWithCountUp","_ref","iProps","defaultProps","_objectSpread","duration","useEasing","useGrouping","preserveValue","decimals","formattingFn","useCallback","value","formatDisplayNumber","type","_jsx","CountUp","end","toNumber","formatNumberTooltipWrap","_ref2","formattedNumStr","_ref2$colorShader","colorShader","_ref2$isBold","isBold","_ref2$isShowTBMK","isShowTBMK","toolTipProps","prefix","suffix","_ref2$showToolTip","showToolTip","countUpProps","showPositive","_ref2$colorSuffix","colorSuffix","isShowApproximatelyEqualTo","minDecimalPlaces","showZeroIfNegative","_ref2$isUseMockNumber","isUseMockNumber","_ref2$isShowSuffixInT","isShowSuffixInTooltip","numRes","displayStrWithCountUp","disPlayStr","isNaN","isZero","lt","suffixDom","className","children","showColorNumber","arguments","length","undefined","eq","_jsxs","style","color","displayNumStr","toString","startsWith","slice","Tooltip","title","concat","bNToS","formatNumberWithTooltip","_ref3","_ref3$colorShader","_ref3$isBold","_ref3$isShowTBMK","formatPriceNumberWithTooltip","_ref4","_ref4$colorShader","_ref4$isOperateNum","isOperateNum","_ref4$isShowTBMK","significantDigits","roundingMode","formatLiqPriceNumberWithTooltip","_ref5","_ref5$colorShader","options","_objectWithoutProperties","_excluded","price","abs","Infinity","formatPercentage","_ref8","percentage","_ref8$hundredfold","hundredfold","_ref8$colorShader","customTitle","_ref8$decimals","withThreshHold","_ref8$prefix","_ref8$suffix","_ref8$isColorShaderWh","isColorShaderWhiteIfZero","_ref8$isHiddenIfZero","isHiddenIfZero","_ref8$requirePlusSymb","requirePlusSymbol","percentageNumber","WrappedBigNumber","mul","displayString","formatNumber","percentageBN","threshold","Math","pow","notEq","gt","stringValue","colorShaderClassname","plusMinusSymbol","classNames","arr","CHAIN_ID","process","split","map","chainIdStr","Number","parseInt","_process$env$REACT_AP","_chainConfigs","_defineProperty","getChainConfigInfo","DAPP_CHAIN_CONFIGS","_DAPP_CHAIN_CONFIGS","getDappChainConfig","linea","blastSepolia","blast","arbitrum","base","DEFAULT_DECIMALS","SEARCH_PAIR_SORTERS","SIGNIFICANT_DIGITS","_SEARCH_PAIR_SORTERS_","FAVORITE","EARN_FAVORITE","VOLUME_24H","CHANGE_24H","TVL","OI","APY","BOOSTED_LIQUIDITY","AIP_DOMAIN","JWT_FOR_TGP","LOCAL_RPC_URL","getChainName","chainId","chainName","dappChainConfig","network","name","Object","values","config","blockExplorer","url","getProviderFromLocalOrSetting","_x3","_getProviderFromLocalOrSetting","apply","_asyncToGenerator","_regeneratorRuntime","mark","_callee2","localRpcUrl","_CHAIN_WSS_RPC_URLS$c2","wssRpcUrl","wrap","_context2","prev","next","getRpcFromLocalForage","sent","CHAIN_WSS_RPC_URLS","abrupt","provider","ReconnectingWebSocketProvider","getFallbackProvider","CHAIN_HTTP_RPC_URLS","rpc","StaticJsonRpcProvider","stop","urls","params","providers","index","priority","weight","stallTimeout","pollingFunc","func","interval","setInterval","bigNumberObjectCheck","obj","cloneObj","_","keys","forEach","key","val","bn","BigNumber","_hex","hex","_typeof","WrappedQuote","newVal","error","debounceRequest","wait","timeout","_len","args","Array","_key","Promise","resolve","reject","clearTimeout","setTimeout","then","catch","getShortFormDeciamal","numBN","tailSignificantDigits","numStr","countZeros","decimalPart","i","countNumTrailingZeros","_numStr$split","_numStr$split2","_slicedToArray","integerPart","tail","tailWithPaddingZero","repeat","decimalShortFormSymbolMap","number","utils","BN","radix","res","toCurrencyNumber","x","parts","replace","join","CURRENCY_UNITS","CURRENCY_UNIT_NUM","getBigCurrencyNum","unit","DEFAULT_DECIMAL_PLACES","findIndex","u","div","integerValue","precision","toFixed","toPrecision","_ref$isShowSeparator","isShowSeparator","_ref$type","_ref$isOperateNum","_ref$isShowTBMK","_ref$isShowApproximat","_ref$roundingMode","_ref$significantDigit","_ref$minDecimalPlaces","sign","isNegative","minExclusiveNumToShowShortDecimal","decimalPlaces","numberWithCommas","isRemoveTrailingZeros","match","inputNumChecker","allowMinus","regex","_integerPart","substring","indexOf","_decimalPart","formatEther","isInverse","ZERO","wdiv","toWad","toEtherReciprocalNumber","parseUnits","formatPercentageString","_ref2$hundredfold","_ref2$decimals","_ref2$roundingMode","getTGPJWTToken","address","Cookies","_x21","_getRpcFromLocalForage","_callee12","signatureInStorage","_context12","localforage","t0","getTokenInfo","token","id","toLowerCase","isWrappedNativeToken","wrappedNativeToken","_wrappedNativeToken","_wrappedNativeToken$a","mappingToken","marketType","_ref$unWrappedNativeT","unWrappedNativeToken","nativeToken","mToken","MarketType","includes","symbol","reducePortfolio","userAddr","instrumentAddr","portfolio","accountRecords","accountMap","positionMap","portfolioMap","orderMap","rangeMap","blockInfo","height","timestamp","metaPortfolio","accountId","getAccountId","getPortfolioId","expiry","pairId","getPairId","instrumentId","transformMetaPortfolio","position","metaPosition","portfolioId","positionId","transformToMetaPosition","orders","order","metaOrder","orderId","getOrderId","oid","transformToMetaOrder","ranges","range","metaRange","rangeId","getRangeId","rid","transformToMetaRange","VaultActionId","_vaultStageInfos","Stage","bgColor","i18nId","_vaultActionInfos","SPOT_KLINE_INTERVAL","SpotDexType","_SPOT_KLINE_INTERVAL_","H_1","D_1","W_1","SynPoolType","OTHER","spotDexInfos","_spotDexInfos","PANCAKE_V3","imageSrc","Pancake","version","UNISWAP_V3","Uni","UNISWAP_V2","AERODROME_V3","Aero","AERODROME_V2","SUSHISWAP_V3","Sushi","ALB_V3","ALB","filter","pool","_$get","CAMPAIGN_TYPE","axiosGet","_x","_axiosGet","_callee","jwtToken","pa","encryptedData","_context","URLSearchParams","sort","getEncrypted","axios","headers","Authorization","body","domain","uri","getEncryptedHeader","authorization","getAdjustTradePrice","fetchFuturesInstrument","_res$data","data","amms","reduce","amm","set","Map","_x5","_x6","fetchFuturesPairInfo","_res$data2","_res$data3","p","instrumentAddress","fairPrice","markPrice","fairPriceChange24h","markPriceChange24h","liquidityApy","volume24h","openInterests","tvl","volume24hUsd","tvlUsd","effectLiqTvl","openInterestsUsd","longOi","shortOi","_1hPeriodsFunding","long","short","_1hLastFunding","poolFee24h","_x7","SUBSCRIBE_TYPE","_callee3","_res$data4","sdk","newData","_context3","acc","depth","tick2Pearl","liquidityNet","left","depthData","perpDataSource","getDepthDataByLiquidityDetails","size","tickDelta","temp","right","d","_x8","_ref7","_callee4","_ref6","_res$data5","_context4","getDepthRangeDataByLiquidityDetails","stepRatio","_x9","_ref9","_callee5","_res$data6","chartDuration","_res$data7","dataSource","_context5","isLongPay","longFundingRate","payRate","shortFundingRate","receiveRate","_x10","_ref11","_callee6","_ref10","_res$data8","timeEnd","utcEnd","utcNow","startTs","endTs","_context6","floor","Date","now","moment","second","unix","KlineInterval","add","instrument","baseVolume","_x11","UNSUBSCRIBE_TYPE","MESSAGE_TYPE","DEBOUNCE_API_TIME","ChainSynWorker","_this","cacheDuration","_classCallCheck","chainContextWorker","socketInstance","instrumentMap","instrumentSpotStateMap","gateBalanceMap","instrumentSpotRawPriceMap","listeningEvent","instrumentContractMap","marketPairInfo","isRequestPair","isRequestPortfolio","isRequestBalance","pollingTimers","blockNumberCache","watcherInstrumentAddr","watcherAddr","getInstrumentWithFallback","debounce","apiResult","chainResult","getInstrumentFromApi","Error","getInstrumentFromChain","t1","_futuresItem$blockInf","futuresItem","_block","block","updateInstrumentCache","_x2","getPortfolioWithFallback","getPortfolio","dispatchInstrumentUpdateEvent","eventName","eventArgs","txHash","trader","emitWorkerEvent","WorkerEventNames","transactionHash","_x4","dispatchPortfolioUpdateEvent","dispatchGateUpdateEvent","_ref12","getMarketPairInfoFromApi","_ref13","_callee7","pairInfo","_context7","this","ChainContextWorker","initSocketInstance","_createClass","_initSDK","_callee8","_chainId","dappConfig","vaultGraphAddr","ctx","_context8","vaultConfig","graphAddr","Context","use","perpPlugin","inverse","txPlugin","gasLimitMultiple","gasEstimator","DefaultEthGasEstimator","perpDataSourcePlugin","endpoint","subgraph","perpLaunchpadPlugin","perpLaunchpadDataSourcePlugin","aggregatorPlugin3","aggregatorDataSourcePlugin3","setProvider","init","_init","_callee9","_context9","readProviderFromLocalOrSetting","initSDK","get","chainContext","_getBlockNumber","_callee10","blockNumber","_context10","getBlockNumber","_getAllFuturesFromChain","_callee11","futuresList","_futuresItem$blockInf2","_futuresItem$blockInf3","futuresMap","_context11","perp","observer","getAllInstruments","blockTag","futures","_getInstrumentFromChain","instrumentList","_futuresItem$blockInf4","_futuresItem$blockInf5","cachedFuturesItem","getInstrument","expiries","_x12","_x13","_batchInstrumentFromChain","_callee13","_firstPair$expiries","firstPair","_this2","_context13","_futuresItem$blockInf6","_x14","_x15","_getInstrumentSpotStateFromChain","_callee14","_ref14","marketContract","spotState","_context14","market","info","contracts","marketContracts","getSpotState","updateSpotStateCache","_x16","_getInstrumentRawSpotPriceFromChain","_callee15","cachedSpotPrice","spotPrice","_context15","getRawSpotPrice","baseSymbol","quoteSymbol","quote","_x17","_x18","futuresRecord","allFutures","futuresObj","_res$blockInfo","pairMap","futuresCore","transformToMetaFutures","pairCore","transformToMetaPair","reduceFuturesForWorker","pairList","from","raw","spot","time","cachedSpotState","_getPortfolio","_callee16","_ref15","_portfolio$blockInfo","cachedPortfolio","_context16","traderAddr","updatePortfolioCache","_x19","_getPortfolioList","_callee17","needFetchInstruments","_portfolioList","instruments","fetchParams","portfolioList","_portfolioItem$blockI","portfolioItem","_this3","_context17","getAllFuturesFromChain","PERP_EXPIRY","_portfolio$blockInfo2","_x20","_x22","_ref16","reducedPortfolio","_ref17","_ref18","_getGateBalanceFromChain","_callee18","tokens","quotes","_yield$this$sdk$perp$","_yield$this$sdk$perp$2","balances","_this4","_context18","NATIVE_TOKEN_ADDRESS","t","getVaultBalances","_this4$gateBalanceMap","tokenAddress","balance","cachedBalanceInfo","gateBalance","_x23","_x24","_x25","_getToken","_callee19","tokenAddr","cachedToken","_token$address2","_context19","erc20","find","_token$address","_x26","_this$listeningEvent$","_this5","gateContract","gate","once","topics","interface","getEventTopic","ethers","_ref19","_callee20","event","_parsedLog$args$trade","parsedLog","_context20","parseLog","getToken","getGateBalanceFromChain","_x27","_ref20","_callee21","instrumentModel","_instrumentModel$data","_instrumentModel$data2","_context21","pollingInstrument","batchInstrumentFromChain","_x28","instrumentContract","Instrument__factory","_this$listeningEvent$2","_this6","getInstrumentContract","on","_parsedLog$args$trade2","_this$listeningEvent$3","_this7","eventFilter","_parsedLog$args$trade3","_socket$socket","_this8","socket","hasListeners","perpEvent","emit","EVENT","_event$contractAddres","handleSocketEvent","contractAddress","contractType","blockNum","off","_handleSocketEvent","_callee22","_ref21","_eventArgs$trader","_expiry2","_expiry3","_context22","_x29","removeAllListeners","_pollingInstrument","_callee23","timer","_this9","_context23","getInstrumentRawSpotPriceFromChain","getInstrumentSpotStateFromChain","_x30","SocketService","connect","isDiff","cachedPairInfo","_pollingInstrumentFromApi","_callee24","_this10","_context24","_x31","_getInstance","_callee25","instance","_context25","instances","_x32","onmessage","_ref22","_callee26","e","_event$data","_userAddr","worker","_event$data2","_chainId2","_instrumentAddr","_worker","_event$data3","_chainId3","_userAddr2","_instrumentAddr2","_worker2","_event$data4","_chainId4","_worker3","_event$data5","_chainId5","_instrumentAddr3","_expiry4","_userAddr3","_blockNumber","_worker4","_event$data6","_chainId6","_userAddr4","_blockNumber2","_worker5","_event$data7","_chainId7","_userAddr5","_blockNumber3","_worker6","_event$data8","_chainId8","_instrumentAddr4","_blockNumber4","_worker7","_event$data9","_chainId9","_chainId10","_worker9","_context26","getInstance","watchSocketEvent","getPortfolioList","removeSocketEvent","_x33","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","m","__webpack_exports__","O","amdO","deferred","result","chunkIds","fn","notFulfilled","fulfilled","j","every","splice","r","n","getter","__esModule","a","leafPrototypes","getProto","getPrototypeOf","__proto__","mode","ns","create","def","current","getOwnPropertyNames","definition","o","defineProperty","enumerable","f","chunkId","all","promises","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","Symbol","toStringTag","nmd","paths","installedChunks","importScripts","chunkLoadingGlobal","self","parentChunkLoadingFunction","push","bind","moreModules","runtime","pop","nc"],"sourceRoot":""}