@kodiak-finance/orderly-utils 2.8.18 → 2.8.19-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +53 -1
- package/dist/index.d.ts +53 -1
- package/dist/index.js +513 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +454 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/decimal.ts","../src/dateTime.ts","../src/chain.ts","../src/string.ts","../src/window.ts","../src/symbol.ts","../src/order.ts"],"sourcesContent":["// import dayjs from \"dayjs\";\n\nexport { default as Decimal } from \"./decimal\";\nexport * from \"./decimal\";\nexport * from \"./dateTime\";\nexport * from \"./chain\";\nexport * from \"./string\";\nexport { windowGuard, getGlobalObject, getTimestamp } from \"./window\";\nexport { default as dayjs } from \"dayjs\";\nexport * from \"./symbol\";\nexport * from \"./order\";\n\n// export { dayjs };\n","import Decimal from \"decimal.js-light\";\n\nexport type { Numeric } from \"decimal.js-light\";\n\nDecimal.set({ rounding: Decimal.ROUND_DOWN });\n\nexport default Decimal;\n\nexport const cutNumber = (num: number | string, lenght: number) => {};\n\nexport const zero = new Decimal(0);\n\n/** if num is undefined or null, returns options?.fallback || '-', otherwise it formats */\nexport const commifyOptional = (\n num?: number | string | null,\n options?: {\n fix?: number;\n fallback?: string;\n padEnd?: boolean;\n /// default is '0'\n fillString?: string;\n prefix?: string;\n },\n): string => {\n // if num convert to num failed, return fallback\n if (typeof num === \"string\" && Number.isNaN(Number(num))) {\n return options?.fallback || \"--\";\n }\n\n const prefix = options?.prefix || \"\";\n if (typeof num === \"undefined\" || num === null) {\n return prefix + (options?.fallback || \"--\");\n }\n const value = commify(num, options?.fix);\n\n if (options && options.padEnd && options.fix) {\n const fillString = options?.fillString || \"0\";\n const hasDecimal = value.includes(\".\");\n const list = value.split(\".\");\n if (hasDecimal) {\n return prefix + list[0] + \".\" + list[1].padEnd(options.fix, fillString);\n }\n return prefix + list[0] + \".\" + \"\".padEnd(options.fix, fillString);\n }\n return prefix + value;\n};\n\nconst THOUSANDS_REGEXP = /\\B(?=(\\d{3})+(?!\\d))/g;\nexport const commify = (num: number | string, fix?: number): string => {\n const str = `${num}`;\n const parts = str.split(\".\");\n const numberPart = parts[0];\n const decimalPart = parts[1];\n const endsWithPoint = str.endsWith(\".\") && str.length > 1;\n const result =\n numberPart.replace(THOUSANDS_REGEXP, \",\") +\n (decimalPart\n ? \".\" + decimalPart.substring(0, fix || decimalPart.length)\n : endsWithPoint\n ? \".\"\n : \"\");\n\n if (fix === 0 && result.includes(\".\")) {\n return result.substring(0, result.indexOf(\".\"));\n }\n return result;\n};\n\nconst SCIENTIFICNOTATION_REGEX = /\\d(?:\\.(\\d*))?e([+-]\\d+)/;\nexport const toNonExponential = (num: number) => {\n const m = num.toExponential().match(SCIENTIFICNOTATION_REGEX);\n if (!Array.isArray(m)) {\n return num;\n }\n return num.toFixed(\n Math.max(0, (m[1] || \"\").length - (m[2] as unknown as number)),\n );\n};\n\nexport const getPrecisionByNumber = (num: number | string) => {\n num = toNonExponential(Number(num));\n const parts = num.toString().split(\".\");\n return parts[1] ? parts[1].length : 0;\n};\n\n/**\n *\n * @example\n * const number1 = 12345;\n * const number2 = 987654321;\n */\nexport function numberToHumanStyle(\n number: number,\n decimalPlaces: number = 2,\n options?: {\n padding?: boolean;\n },\n): string {\n const { padding } = options || {};\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\"];\n\n let index = 0;\n while (number >= 1000 && index < abbreviations.length - 1) {\n number /= 1000;\n index++;\n }\n\n const roundedNumber = new Decimal(number)\n .toFixed(decimalPlaces, Decimal.ROUND_DOWN)\n .toString()\n .replace(/\\.0+$/, \"\");\n\n return `${roundedNumber}${abbreviations[index]}`;\n}\n\n// export function numberToHumanStyle(num: number, dp: number = 0): string {\n// const absNum = Math.abs(num);\n// let formattedNum = \"\";\n\n// let exp;\n\n// if (absNum >= 1e12) {\n// formattedNum = (num / 1e12).toFixed(dp) + \"T\";\n// } else if (absNum >= 1e9) {\n// formattedNum = (num / 1e9).toFixed(dp) + \"B\";\n// } else if (absNum >= 1e6) {\n// formattedNum = (num / 1e6).toFixed(dp) + \"M\";\n// } else if (absNum >= 1e3) {\n// formattedNum = (num / 1e3).toFixed(dp) + \"K\";\n// } else {\n// formattedNum = num.toString();\n// }\n\n// formattedNum = formattedNum.replace(/\\.0$/, \"\");\n\n// return formattedNum;\n// }\n\nexport function parseNumStr(str: string | number): Decimal | undefined {\n const value = str.toString();\n const cleanedStr = value.replace(/,/g, \"\"); // remove `,` char\n const numberPart = new Decimal(cleanedStr);\n const unitPart = cleanedStr.slice(-1);\n\n if (Number.isNaN(numberPart.toNumber())) {\n return undefined; // invalid data\n }\n\n let result;\n\n switch (unitPart) {\n case \"k\":\n case \"K\":\n result = numberPart.mul(1000);\n break;\n case \"m\":\n case \"M\":\n result = numberPart.mul(1000000);\n break;\n case \"b\":\n case \"B\":\n result = numberPart.mul(1000000000);\n break;\n case \"t\":\n case \"T\":\n result = numberPart.mul(1000000000000);\n break;\n default:\n result = numberPart;\n }\n\n return result;\n}\n\nconst SCIENTIFICNOTATIONPATTERN = /^[-+]?[0-9]+(\\.[0-9]+)?[eE][-+]?[0-9]+$/;\n\nconst TRAILINGZERODECIMAL_REGEX = /(\\.[0-9]*[1-9])0+$/;\n\n//** remove trailing zeros 0.00000100 => 0.000001, 1 => 1 */\nexport const removeTrailingZeros = (value: number, fixedCount: number = 16) => {\n const text = `${value}`;\n const isScientific = SCIENTIFICNOTATIONPATTERN.test(text);\n if (!value.toString().includes(\".\") && !isScientific) {\n return `${value}`;\n }\n const formattedNumber = new Decimal(value)\n .toFixed(fixedCount)\n .replace(TRAILINGZERODECIMAL_REGEX, \"$1\");\n return formattedNumber;\n};\n\nexport const todpIfNeed = (value: string | number, dp: number) => {\n if (value === undefined || value === \"\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n value = value.toString();\n }\n\n if (value.endsWith(\".\")) {\n return value;\n }\n\n const numbers = value.split(\".\");\n\n if (numbers.length === 1) {\n return value;\n }\n\n if (numbers[1].length <= dp || !numbers[1]) {\n return value;\n }\n\n return `${numbers[0]}.${numbers[1].substring(0, dp)}`;\n};\n\nexport const checkIsNaN = (value: string | number | undefined | null) => {\n if (value === undefined || value === \"\" || value === null) {\n return true;\n }\n return Number.isNaN(Number(value));\n};\n","export const timeConvertString = (time: number): number[] => {\n time /= 1000;\n const h = Math.floor(time / 3600);\n const m = Math.floor((time / 60) % 60);\n const s = Math.floor(time % 60);\n return [h, m, s];\n};\n\n/// will be return 'yyyy-mm-dd hh:MM:ss'\nexport const timestampToString = (timestamp: number): string => {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n};\n\nexport function subtractDaysFromCurrentDate(\n days: number,\n startDate?: Date\n): Date {\n const currentDate = startDate || new Date();\n const resultDate = new Date(currentDate);\n resultDate.setDate(currentDate.getDate() - days);\n return resultDate;\n}\n","import {\n ABSTRACT_TESTNET_CHAINID,\n ARBITRUM_TESTNET_CHAINID,\n BSC_TESTNET_CHAINID,\n MONAD_TESTNET_CHAINID,\n SOLANA_TESTNET_CHAINID,\n STORY_TESTNET_CHAINID,\n SOLANA_MAINNET_CHAINID,\n} from \"@kodiak-finance/orderly-types\";\n\nexport const hex2int = (chainId: string): number => parseInt(chainId);\nexport const int2hex = (chainId: number): string => `0x${chainId.toString(16)}`;\nexport const praseChainId = (chainId: string | number): number => {\n if (typeof chainId === \"string\") return hex2int(chainId);\n return chainId;\n};\n\nexport const praseChainIdToNumber = (chainId: string | number): number => {\n if (\n typeof chainId === \"string\" &&\n chainId.startsWith(\"0x\") &&\n /^[a-f0-9]+$/iu.test(chainId.slice(2))\n )\n return hex2int(chainId);\n return chainId as number;\n};\n\nexport const parseChainIdToNumber = praseChainIdToNumber;\n\nexport const isTestnet = (chainId: number) => {\n const testnetIds = [\n ARBITRUM_TESTNET_CHAINID,\n SOLANA_TESTNET_CHAINID,\n STORY_TESTNET_CHAINID,\n MONAD_TESTNET_CHAINID,\n ABSTRACT_TESTNET_CHAINID,\n BSC_TESTNET_CHAINID,\n ];\n\n return testnetIds.includes(chainId);\n};\n\nexport const isSolana = (chainId: number) => {\n return [SOLANA_TESTNET_CHAINID, SOLANA_MAINNET_CHAINID].includes(chainId);\n};\n","export function capitalizeString(str: string): string {\n // Convert the string to lowercase\n const lowercaseStr: string = str.toLowerCase();\n // Capitalize the first letter\n const capitalizedStr: string =\n lowercaseStr.charAt(0).toUpperCase() + lowercaseStr.slice(1);\n return capitalizedStr;\n}\n\n/// \"PERP_ETH_USDC\" => \"ETH_PERP\"\nexport function transSymbolformString(input: string): string {\n const parts = input.split(\"_\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid string format\");\n }\n\n const [first, second, third] = parts;\n\n if (!first.startsWith(\"PERP\")) {\n throw new Error(\"Invalid string format\");\n }\n\n const result = `${second}-${first}`;\n return result;\n}\n\nexport function camelCaseToUnderscoreCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nexport const findLongestCommonSubString = (str1: string, str2: string) => {\n // let index = 0;\n\n for (let index = 0; index < str1.length; index++) {\n const ele1 = str1.at(index);\n const ele2 = str2.at(index);\n if (ele1 === ele2) {\n continue;\n }\n\n return index;\n }\n\n return -1;\n};\n","export const windowGuard = (cb: Function) => {\n if (typeof window !== \"undefined\") {\n cb();\n }\n};\n\nexport const getGlobalObject = () => {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n if (typeof self !== \"undefined\") {\n return self;\n }\n if (typeof window !== \"undefined\") {\n return window;\n }\n // @ts-ignore\n if (typeof global !== \"undefined\") {\n // @ts-ignore\n return global;\n }\n throw new Error(\"cannot find the global object\");\n};\n\n\n/// get timestamp\nexport const getTimestamp = (): number => {\n\n if (typeof window !== \"undefined\") {\n // @ts-ignore\n const timeOffset = getGlobalObject()?.__ORDERLY_timestamp_offset;\n if (typeof timeOffset === 'number') {\n return Date.now() + (timeOffset || 0);\n }\n }\n return Date.now();\n}","/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import {\n API,\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@kodiak-finance/orderly-types\";\nimport Decimal from \"./decimal\";\n\n/**\n * Trailing stop price calculation\n * If using trailing_value\n * Long (buy): trailing_stop = extreme_price - trailing_value\n * Short (sell): trailing_stop = extreme_price + trailing_value\n *\n * If using trailing_rate\n * Long (buy): extreme_price * (1 - trailing_rate)\n * Short (sell): extreme_price * (1 + trailing_rate)\n */\nexport function getTrailingStopPrice(order: API.AlgoOrderExt) {\n const { side, extreme_price, callback_value, callback_rate } = order;\n\n const isBuy = side === OrderSide.BUY;\n\n if (!extreme_price) {\n return 0;\n }\n\n if (callback_value) {\n return isBuy\n ? new Decimal(extreme_price).plus(callback_value).toNumber()\n : new Decimal(extreme_price).minus(callback_value).toNumber();\n }\n\n if (callback_rate) {\n return isBuy\n ? new Decimal(extreme_price)\n .mul(new Decimal(1).plus(callback_rate))\n .toNumber()\n : new Decimal(extreme_price)\n .mul(new Decimal(1).minus(callback_rate))\n .toNumber();\n }\n\n return 0;\n}\n\nexport function getBBOType(options: {\n type: OrderType;\n side: OrderSide;\n level: OrderLevel;\n}) {\n const { type, side, level } = options;\n if (type === OrderType.ASK) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY1\n : BBOOrderType.QUEUE1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY5\n : BBOOrderType.QUEUE5;\n }\n }\n\n if (type === OrderType.BID) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE1\n : BBOOrderType.COUNTERPARTY1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE5\n : BBOOrderType.COUNTERPARTY5;\n }\n }\n}\n\nexport function getTPSLDirection(inputs: {\n side: OrderSide;\n type: \"tp\" | \"sl\";\n closePrice: number;\n orderPrice: number;\n}) {\n const { side, type, closePrice, orderPrice } = inputs;\n\n let direction = 1;\n if (side === OrderSide.BUY) {\n if (type === \"tp\") {\n // close price >= order price\n direction = closePrice >= orderPrice ? 1 : -1;\n } else {\n // close price < order price\n direction = closePrice < orderPrice ? -1 : 1;\n }\n }\n\n if (side === OrderSide.SELL) {\n if (type === \"tp\") {\n // close price <= order price\n direction = closePrice <= orderPrice ? 1 : -1;\n } else {\n // close price > order price\n direction = closePrice > orderPrice ? -1 : 1;\n }\n }\n\n return direction;\n}\n"],"mappings":"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","names":["src_exports","__export","decimal_default","camelCaseToUnderscoreCase","capitalizeString","checkIsNaN","commify","commifyOptional","cutNumber","findLongestCommonSubString","formatSymbol","getBBOType","getGlobalObject","getPrecisionByNumber","getTPSLDirection","getTimestamp","getTrailingStopPrice","hex2int","int2hex","isSolana","isTestnet","numberToHumanStyle","parseChainIdToNumber","parseNumStr","praseChainId","praseChainIdToNumber","removeTrailingZeros","subtractDaysFromCurrentDate","timeConvertString","timestampToString","toNonExponential","todpIfNeed","transSymbolformString","windowGuard","zero","__toCommonJS","import_decimal","Decimal","decimal_default","cutNumber","num","lenght","zero","commifyOptional","options","prefix","value","commify","fillString","hasDecimal","list","THOUSANDS_REGEXP","fix","str","parts","numberPart","decimalPart","endsWithPoint","result","SCIENTIFICNOTATION_REGEX","toNonExponential","m","getPrecisionByNumber","numberToHumanStyle","number","decimalPlaces","padding","abbreviations","index","parseNumStr","cleanedStr","unitPart","SCIENTIFICNOTATIONPATTERN","TRAILINGZERODECIMAL_REGEX","removeTrailingZeros","fixedCount","text","isScientific","todpIfNeed","dp","numbers","checkIsNaN","timeConvertString","time","h","m","s","timestampToString","timestamp","date","year","month","day","hours","minutes","seconds","subtractDaysFromCurrentDate","days","startDate","currentDate","resultDate","import_orderly_types","hex2int","chainId","int2hex","praseChainId","praseChainIdToNumber","parseChainIdToNumber","isTestnet","isSolana","capitalizeString","str","lowercaseStr","transSymbolformString","input","parts","first","second","third","camelCaseToUnderscoreCase","findLongestCommonSubString","str1","str2","index","ele1","ele2","windowGuard","cb","getGlobalObject","getTimestamp","_a","timeOffset","import_dayjs","formatSymbol","symbol","formatString","arr","type","base","quote","import_orderly_types","getTrailingStopPrice","order","side","extreme_price","callback_value","callback_rate","isBuy","decimal_default","getBBOType","options","type","level","getTPSLDirection","inputs","closePrice","orderPrice","direction"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/decimal.ts","../src/dateTime.ts","../src/chain.ts","../src/string.ts","../src/window.ts","../src/symbol.ts","../src/order.ts","../src/formatNum.ts"],"sourcesContent":["// import dayjs from \"dayjs\";\n\nexport { default as Decimal } from \"./decimal\";\nexport * from \"./decimal\";\nexport * from \"./dateTime\";\nexport * from \"./chain\";\nexport * from \"./string\";\nexport { windowGuard, getGlobalObject, getTimestamp } from \"./window\";\nexport { default as dayjs } from \"dayjs\";\nexport * from \"./symbol\";\nexport * from \"./order\";\nexport * from \"./formatNum\";\n\n// export { dayjs };\n","import Decimal from \"decimal.js-light\";\n\nexport type { Numeric } from \"decimal.js-light\";\n\nDecimal.set({ rounding: Decimal.ROUND_DOWN });\n\nexport default Decimal;\n\nexport const cutNumber = (num: number | string, lenght: number) => {};\n\nexport const zero = new Decimal(0);\n\n/** if num is undefined or null, returns options?.fallback || '-', otherwise it formats */\nexport const commifyOptional = (\n num?: number | string | null,\n options?: {\n fix?: number;\n fallback?: string;\n padEnd?: boolean;\n /// default is '0'\n fillString?: string;\n prefix?: string;\n },\n): string => {\n // if num convert to num failed, return fallback\n if (typeof num === \"string\" && Number.isNaN(Number(num))) {\n return options?.fallback || \"--\";\n }\n\n const prefix = options?.prefix || \"\";\n if (typeof num === \"undefined\" || num === null) {\n return prefix + (options?.fallback || \"--\");\n }\n const value = commify(num, options?.fix);\n\n if (options && options.padEnd && options.fix) {\n const fillString = options?.fillString || \"0\";\n const hasDecimal = value.includes(\".\");\n const list = value.split(\".\");\n if (hasDecimal) {\n return prefix + list[0] + \".\" + list[1].padEnd(options.fix, fillString);\n }\n return prefix + list[0] + \".\" + \"\".padEnd(options.fix, fillString);\n }\n return prefix + value;\n};\n\nconst THOUSANDS_REGEXP = /\\B(?=(\\d{3})+(?!\\d))/g;\nexport const commify = (num: number | string, fix?: number): string => {\n const str = `${num}`;\n const parts = str.split(\".\");\n const numberPart = parts[0];\n const decimalPart = parts[1];\n const endsWithPoint = str.endsWith(\".\") && str.length > 1;\n const result =\n numberPart.replace(THOUSANDS_REGEXP, \",\") +\n (decimalPart\n ? \".\" + decimalPart.substring(0, fix || decimalPart.length)\n : endsWithPoint\n ? \".\"\n : \"\");\n\n if (fix === 0 && result.includes(\".\")) {\n return result.substring(0, result.indexOf(\".\"));\n }\n return result;\n};\n\nconst SCIENTIFICNOTATION_REGEX = /\\d(?:\\.(\\d*))?e([+-]\\d+)/;\nexport const toNonExponential = (num: number) => {\n const m = num.toExponential().match(SCIENTIFICNOTATION_REGEX);\n if (!Array.isArray(m)) {\n return num;\n }\n return num.toFixed(\n Math.max(0, (m[1] || \"\").length - (m[2] as unknown as number)),\n );\n};\n\nexport const getPrecisionByNumber = (num: number | string) => {\n num = toNonExponential(Number(num));\n const parts = num.toString().split(\".\");\n return parts[1] ? parts[1].length : 0;\n};\n\n/**\n *\n * @example\n * const number1 = 12345;\n * const number2 = 987654321;\n */\nexport function numberToHumanStyle(\n number: number,\n decimalPlaces: number = 2,\n options?: {\n padding?: boolean;\n },\n): string {\n const { padding } = options || {};\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\"];\n\n let index = 0;\n while (number >= 1000 && index < abbreviations.length - 1) {\n number /= 1000;\n index++;\n }\n\n const roundedNumber = new Decimal(number)\n .toFixed(decimalPlaces, Decimal.ROUND_DOWN)\n .toString()\n .replace(/\\.0+$/, \"\");\n\n return `${roundedNumber}${abbreviations[index]}`;\n}\n\n// export function numberToHumanStyle(num: number, dp: number = 0): string {\n// const absNum = Math.abs(num);\n// let formattedNum = \"\";\n\n// let exp;\n\n// if (absNum >= 1e12) {\n// formattedNum = (num / 1e12).toFixed(dp) + \"T\";\n// } else if (absNum >= 1e9) {\n// formattedNum = (num / 1e9).toFixed(dp) + \"B\";\n// } else if (absNum >= 1e6) {\n// formattedNum = (num / 1e6).toFixed(dp) + \"M\";\n// } else if (absNum >= 1e3) {\n// formattedNum = (num / 1e3).toFixed(dp) + \"K\";\n// } else {\n// formattedNum = num.toString();\n// }\n\n// formattedNum = formattedNum.replace(/\\.0$/, \"\");\n\n// return formattedNum;\n// }\n\nexport function parseNumStr(str: string | number): Decimal | undefined {\n const value = str.toString();\n const cleanedStr = value.replace(/,/g, \"\"); // remove `,` char\n const numberPart = new Decimal(cleanedStr);\n const unitPart = cleanedStr.slice(-1);\n\n if (Number.isNaN(numberPart.toNumber())) {\n return undefined; // invalid data\n }\n\n let result;\n\n switch (unitPart) {\n case \"k\":\n case \"K\":\n result = numberPart.mul(1000);\n break;\n case \"m\":\n case \"M\":\n result = numberPart.mul(1000000);\n break;\n case \"b\":\n case \"B\":\n result = numberPart.mul(1000000000);\n break;\n case \"t\":\n case \"T\":\n result = numberPart.mul(1000000000000);\n break;\n default:\n result = numberPart;\n }\n\n return result;\n}\n\nconst SCIENTIFICNOTATIONPATTERN = /^[-+]?[0-9]+(\\.[0-9]+)?[eE][-+]?[0-9]+$/;\n\nconst TRAILINGZERODECIMAL_REGEX = /(\\.[0-9]*[1-9])0+$/;\n\n//** remove trailing zeros 0.00000100 => 0.000001, 1 => 1 */\nexport const removeTrailingZeros = (value: number, fixedCount: number = 16) => {\n const text = `${value}`;\n const isScientific = SCIENTIFICNOTATIONPATTERN.test(text);\n if (!value.toString().includes(\".\") && !isScientific) {\n return `${value}`;\n }\n const formattedNumber = new Decimal(value)\n .toFixed(fixedCount)\n .replace(TRAILINGZERODECIMAL_REGEX, \"$1\");\n return formattedNumber;\n};\n\nexport const todpIfNeed = (value: string | number, dp: number) => {\n if (value === undefined || value === \"\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n value = value.toString();\n }\n\n if (value.endsWith(\".\")) {\n return value;\n }\n\n const numbers = value.split(\".\");\n\n if (numbers.length === 1) {\n return value;\n }\n\n if (numbers[1].length <= dp || !numbers[1]) {\n return value;\n }\n\n return `${numbers[0]}.${numbers[1].substring(0, dp)}`;\n};\n\nexport const checkIsNaN = (value: string | number | undefined | null) => {\n if (value === undefined || value === \"\" || value === null) {\n return true;\n }\n return Number.isNaN(Number(value));\n};\n","export const timeConvertString = (time: number): number[] => {\n time /= 1000;\n const h = Math.floor(time / 3600);\n const m = Math.floor((time / 60) % 60);\n const s = Math.floor(time % 60);\n return [h, m, s];\n};\n\n/// will be return 'yyyy-mm-dd hh:MM:ss'\nexport const timestampToString = (timestamp: number): string => {\n const date = new Date(timestamp);\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n};\n\nexport function subtractDaysFromCurrentDate(\n days: number,\n startDate?: Date\n): Date {\n const currentDate = startDate || new Date();\n const resultDate = new Date(currentDate);\n resultDate.setDate(currentDate.getDate() - days);\n return resultDate;\n}\n","import {\n ABSTRACT_TESTNET_CHAINID,\n ARBITRUM_TESTNET_CHAINID,\n BSC_TESTNET_CHAINID,\n MONAD_TESTNET_CHAINID,\n SOLANA_TESTNET_CHAINID,\n STORY_TESTNET_CHAINID,\n SOLANA_MAINNET_CHAINID,\n} from \"@kodiak-finance/orderly-types\";\n\nexport const hex2int = (chainId: string): number => parseInt(chainId);\nexport const int2hex = (chainId: number): string => `0x${chainId.toString(16)}`;\nexport const praseChainId = (chainId: string | number): number => {\n if (typeof chainId === \"string\") return hex2int(chainId);\n return chainId;\n};\n\nexport const praseChainIdToNumber = (chainId: string | number): number => {\n if (\n typeof chainId === \"string\" &&\n chainId.startsWith(\"0x\") &&\n /^[a-f0-9]+$/iu.test(chainId.slice(2))\n )\n return hex2int(chainId);\n return chainId as number;\n};\n\nexport const parseChainIdToNumber = praseChainIdToNumber;\n\nexport const isTestnet = (chainId: number) => {\n const testnetIds = [\n ARBITRUM_TESTNET_CHAINID,\n SOLANA_TESTNET_CHAINID,\n STORY_TESTNET_CHAINID,\n MONAD_TESTNET_CHAINID,\n ABSTRACT_TESTNET_CHAINID,\n BSC_TESTNET_CHAINID,\n ];\n\n return testnetIds.includes(chainId);\n};\n\nexport const isSolana = (chainId: number) => {\n return [SOLANA_TESTNET_CHAINID, SOLANA_MAINNET_CHAINID].includes(chainId);\n};\n","export function capitalizeString(str: string): string {\n // Convert the string to lowercase\n const lowercaseStr: string = str.toLowerCase();\n // Capitalize the first letter\n const capitalizedStr: string =\n lowercaseStr.charAt(0).toUpperCase() + lowercaseStr.slice(1);\n return capitalizedStr;\n}\n\n/// \"PERP_ETH_USDC\" => \"ETH_PERP\"\nexport function transSymbolformString(input: string): string {\n const parts = input.split(\"_\");\n if (parts.length !== 3) {\n throw new Error(\"Invalid string format\");\n }\n\n const [first, second, third] = parts;\n\n if (!first.startsWith(\"PERP\")) {\n throw new Error(\"Invalid string format\");\n }\n\n const result = `${second}-${first}`;\n return result;\n}\n\nexport function camelCaseToUnderscoreCase(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n}\n\nexport const findLongestCommonSubString = (str1: string, str2: string) => {\n // let index = 0;\n\n for (let index = 0; index < str1.length; index++) {\n const ele1 = str1.at(index);\n const ele2 = str2.at(index);\n if (ele1 === ele2) {\n continue;\n }\n\n return index;\n }\n\n return -1;\n};\n","export const windowGuard = (cb: Function) => {\n if (typeof window !== \"undefined\") {\n cb();\n }\n};\n\nexport const getGlobalObject = () => {\n if (typeof globalThis !== \"undefined\") {\n return globalThis;\n }\n if (typeof self !== \"undefined\") {\n return self;\n }\n if (typeof window !== \"undefined\") {\n return window;\n }\n // @ts-ignore\n if (typeof global !== \"undefined\") {\n // @ts-ignore\n return global;\n }\n throw new Error(\"cannot find the global object\");\n};\n\n\n/// get timestamp\nexport const getTimestamp = (): number => {\n\n if (typeof window !== \"undefined\") {\n // @ts-ignore\n const timeOffset = getGlobalObject()?.__ORDERLY_timestamp_offset;\n if (typeof timeOffset === 'number') {\n return Date.now() + (timeOffset || 0);\n }\n }\n return Date.now();\n}","import { numberToHumanStyle } from \"./decimal\";\n\n/**\n * Format trading pair symbol *\n * Format symbols like \"PERP_BTC_USDT\" according to the specified format\n *\n * @param symbol - Original trading pair symbol in format \"type_base_quote\" (e.g., \"PERP_BTC_USDT\")\n * @param formatString - Format string template, defaults to \"base\"\n * - Supports the following placeholders:\n * - \"type\": Trading type (e.g., \"PERP\")\n * - \"base\": Base currency (e.g., \"BTC\")\n * - \"quote\": Quote currency (e.g., \"USDT\")\n *\n * @returns Formatted string, returns empty string if input is empty\n *\n * @example\n * ```typescript\n * formatSymbol(\"PERP_BTC_USDT\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base\") // \"BTC\"\n * formatSymbol(\"PERP_BTC_USDT\", \"base-type\") // \"BTC-PERP\"\n * formatSymbol(\"SPOT_ETH_USDC\", \"base-quote\") // \"ETH-USDC\"\n * ```\n */\nexport function formatSymbol(\n symbol: string,\n formatString: string = \"base-type\",\n) {\n if (!symbol) {\n return \"\";\n }\n\n // Split symbol by \"_\" to get each component\n const arr = symbol.split(\"_\");\n const type = arr[0]; // Trading type (e.g., PERP, SPOT)\n const base = arr[1]; // Base currency (e.g., BTC, ETH)\n const quote = arr[2]; // Quote currency (e.g., USDT, USDC)\n\n // Use template string to replace placeholders and return formatted result\n return formatString\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n\n/**\n * Optimize symbol text display by converting leading numbers to human-readable format\n *\n * This function matches numbers at the beginning of a symbol string and converts them\n * to abbreviated format (K, M, B, T) for better readability.\n *\n * @param symbol - The symbol string to optimize (e.g., \"1000000BABYDOGE\")\n * @param decimalPlaces - Number of decimal places for the abbreviated number (default: 0)\n * @returns Optimized symbol string (e.g., \"1MBABYDOGE\")\n *\n * @example\n * ```typescript\n * // Basic usage - convert large numbers to abbreviated format\n * optimizeSymbolDisplay(\"1000000BABYDOGE\") // \"1MBABYDOGE\"\n * optimizeSymbolDisplay(\"5000ETH\") // \"5KETH\"\n * optimizeSymbolDisplay(\"1500000000SHIB\") // \"1BSHIB\"\n * optimizeSymbolDisplay(\"2000000000000TOKEN\") // \"2TTOKEN\"\n *\n * // With decimal places\n * optimizeSymbolDisplay(\"1500000TOKEN\", 1) // \"1.5MTOKEN\"\n * optimizeSymbolDisplay(\"2750000COIN\", 2) // \"2.75MTOKEN\"\n *\n * // Edge cases - no modification needed\n * optimizeSymbolDisplay(\"BITCOIN\") // \"BITCOIN\" (no leading number)\n * optimizeSymbolDisplay(\"123.45TOKEN\") // \"123.45TOKEN\" (less than 1000)\n * optimizeSymbolDisplay(\"999COIN\") // \"999COIN\" (less than 1000)\n *\n * // Usage in React component\n * <SymbolText size=\"sm\" optimizeDisplay={true} decimalPlaces={1}>\n * 1000000BABYDOGE\n * </SymbolText>\n * // Renders: \"1MBABYDOGE\" with token icon\n * ```\n */\nexport function optimizeSymbolDisplay(\n symbol: string,\n decimalPlaces: number = 0,\n): string {\n if (!symbol) {\n return \"\";\n }\n\n // Regular expression to match numbers at the beginning of the string\n // Matches: optional decimal numbers starting from the beginning\n const numberRegex = /^(\\d+(?:\\.\\d+)?)/;\n const match = symbol.match(numberRegex);\n\n if (!match) {\n // No leading number found, return original symbol\n return symbol;\n }\n\n const numberPart = match[1]; // The matched number string\n const textPart = symbol.slice(numberPart.length); // The remaining text after the number\n const numericValue = parseFloat(numberPart);\n\n // Only convert numbers >= 1000 to abbreviated format\n if (numericValue < 1000) {\n return symbol;\n }\n\n // Use the imported numberToHumanStyle function from decimal utils\n const abbreviatedNumber = numberToHumanStyle(numericValue, decimalPlaces);\n\n return abbreviatedNumber + textPart;\n}\n","import {\n API,\n BBOOrderType,\n OrderLevel,\n OrderSide,\n OrderType,\n} from \"@kodiak-finance/orderly-types\";\nimport Decimal from \"./decimal\";\n\n/**\n * Trailing stop price calculation\n * If using trailing_value\n * Long (buy): trailing_stop = extreme_price - trailing_value\n * Short (sell): trailing_stop = extreme_price + trailing_value\n *\n * If using trailing_rate\n * Long (buy): extreme_price * (1 - trailing_rate)\n * Short (sell): extreme_price * (1 + trailing_rate)\n */\nexport function getTrailingStopPrice(order: API.AlgoOrderExt) {\n const { side, extreme_price, callback_value, callback_rate } = order;\n\n const isBuy = side === OrderSide.BUY;\n\n if (!extreme_price) {\n return 0;\n }\n\n if (callback_value) {\n return isBuy\n ? new Decimal(extreme_price).plus(callback_value).toNumber()\n : new Decimal(extreme_price).minus(callback_value).toNumber();\n }\n\n if (callback_rate) {\n return isBuy\n ? new Decimal(extreme_price)\n .mul(new Decimal(1).plus(callback_rate))\n .toNumber()\n : new Decimal(extreme_price)\n .mul(new Decimal(1).minus(callback_rate))\n .toNumber();\n }\n\n return 0;\n}\n\nexport function getBBOType(options: {\n type: OrderType;\n side: OrderSide;\n level: OrderLevel;\n}) {\n const { type, side, level } = options;\n if (type === OrderType.ASK) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY1\n : BBOOrderType.QUEUE1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.COUNTERPARTY5\n : BBOOrderType.QUEUE5;\n }\n }\n\n if (type === OrderType.BID) {\n if (level === OrderLevel.ONE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE1\n : BBOOrderType.COUNTERPARTY1;\n }\n\n if (level === OrderLevel.FIVE) {\n return side === OrderSide.BUY\n ? BBOOrderType.QUEUE5\n : BBOOrderType.COUNTERPARTY5;\n }\n }\n}\n\nexport function getTPSLDirection(inputs: {\n side: OrderSide;\n type: \"tp\" | \"sl\";\n closePrice: number;\n orderPrice: number;\n}) {\n const { side, type, closePrice, orderPrice } = inputs;\n\n let direction = 1;\n if (side === OrderSide.BUY) {\n if (type === \"tp\") {\n // close price >= order price\n direction = closePrice >= orderPrice ? 1 : -1;\n } else {\n // close price < order price\n direction = closePrice < orderPrice ? -1 : 1;\n }\n }\n\n if (side === OrderSide.SELL) {\n if (type === \"tp\") {\n // close price <= order price\n direction = closePrice <= orderPrice ? 1 : -1;\n } else {\n // close price > order price\n direction = closePrice > orderPrice ? -1 : 1;\n }\n }\n\n return direction;\n}\n","import Decimal from \"./decimal\";\n\nenum FormatNumType {\n pnl,\n notional,\n roi,\n assetValue,\n collateral,\n}\n\nfunction formatNum(\n type: FormatNumType,\n dp: number = 2,\n num?: number | Decimal | string,\n rm?: number,\n): Decimal | undefined {\n // parse to decimal\n const decimalNum = parseToDecimal(num);\n\n // if parse to decimal failed, return fallback\n if (!decimalNum) {\n return undefined;\n }\n\n // check if the number is greater than 0\n const isMoreThanZero = decimalNum.greaterThan(0);\n\n // format the number based on the type\n switch (type) {\n case FormatNumType.pnl:\n case FormatNumType.roi:\n const innerRm =\n rm ?? (isMoreThanZero ? Decimal.ROUND_DOWN : Decimal.ROUND_UP);\n return format(decimalNum, dp, innerRm);\n case FormatNumType.notional:\n return format(decimalNum, dp, rm ?? Decimal.ROUND_DOWN);\n case FormatNumType.assetValue:\n return format(decimalNum, dp, rm ?? Decimal.ROUND_DOWN);\n case FormatNumType.collateral:\n return format(decimalNum, dp, rm ?? Decimal.ROUND_DOWN);\n }\n}\n\n// format the number to the number of decimal places\nfunction format(num: Decimal, dp: number, rm: number) {\n return num.toDecimalPlaces(dp, rm);\n}\n\nfunction parseToDecimal(num?: number | Decimal | string): Decimal | undefined {\n try {\n if (num instanceof Decimal) {\n return num;\n }\n if (!num) {\n return undefined;\n }\n if (typeof num === \"number\") {\n return new Decimal(num);\n }\n if (typeof num === \"string\") {\n if (!num.trim()) {\n return undefined;\n }\n return new Decimal(num);\n }\n return num;\n } catch (error) {\n return undefined;\n }\n}\n\n// export the formatNum with namespace\ntype FormatNumWithNamespace = typeof formatNum & {\n pnl: (num?: number | Decimal | string) => Decimal | undefined;\n notional: (num?: number | Decimal | string) => Decimal | undefined;\n roi: (num?: number | Decimal | string, dp?: number) => Decimal | undefined;\n assetValue: (num?: number | Decimal | string) => Decimal | undefined;\n collateral: (num?: number | Decimal | string) => Decimal | undefined;\n};\n\nconst formatNumWithNamespace = formatNum as FormatNumWithNamespace;\n\n// add namespace method to formatNum\nformatNumWithNamespace.pnl = (num?: number | Decimal | string) => {\n return formatNum(FormatNumType.pnl, 2, num);\n};\n\nformatNumWithNamespace.notional = (num?: number | Decimal | string) => {\n return formatNum(FormatNumType.notional, 2, num);\n};\n\nformatNumWithNamespace.roi = (num?: number | Decimal | string, dp?: number) => {\n return formatNum(FormatNumType.roi, dp ?? 4, num);\n};\n\nformatNumWithNamespace.assetValue = (num?: number | Decimal | string) => {\n return formatNum(FormatNumType.assetValue, 2, num);\n};\n\nformatNumWithNamespace.collateral = (num?: number | Decimal | string) => {\n return formatNum(FormatNumType.collateral, 2, num);\n};\n\nexport { formatNumWithNamespace as formatNum };\n"],"mappings":"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","names":["Decimal","import_orderly_types"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,455 @@
|
|
|
1
|
-
|
|
1
|
+
// src/decimal.ts
|
|
2
|
+
import Decimal from "decimal.js-light";
|
|
3
|
+
Decimal.set({ rounding: Decimal.ROUND_DOWN });
|
|
4
|
+
var decimal_default = Decimal;
|
|
5
|
+
var cutNumber = (num, lenght) => {
|
|
6
|
+
};
|
|
7
|
+
var zero = new Decimal(0);
|
|
8
|
+
var commifyOptional = (num, options) => {
|
|
9
|
+
if (typeof num === "string" && Number.isNaN(Number(num))) {
|
|
10
|
+
return (options == null ? void 0 : options.fallback) || "--";
|
|
11
|
+
}
|
|
12
|
+
const prefix = (options == null ? void 0 : options.prefix) || "";
|
|
13
|
+
if (typeof num === "undefined" || num === null) {
|
|
14
|
+
return prefix + ((options == null ? void 0 : options.fallback) || "--");
|
|
15
|
+
}
|
|
16
|
+
const value = commify(num, options == null ? void 0 : options.fix);
|
|
17
|
+
if (options && options.padEnd && options.fix) {
|
|
18
|
+
const fillString = (options == null ? void 0 : options.fillString) || "0";
|
|
19
|
+
const hasDecimal = value.includes(".");
|
|
20
|
+
const list = value.split(".");
|
|
21
|
+
if (hasDecimal) {
|
|
22
|
+
return prefix + list[0] + "." + list[1].padEnd(options.fix, fillString);
|
|
23
|
+
}
|
|
24
|
+
return prefix + list[0] + "." + "".padEnd(options.fix, fillString);
|
|
25
|
+
}
|
|
26
|
+
return prefix + value;
|
|
27
|
+
};
|
|
28
|
+
var THOUSANDS_REGEXP = /\B(?=(\d{3})+(?!\d))/g;
|
|
29
|
+
var commify = (num, fix) => {
|
|
30
|
+
const str = `${num}`;
|
|
31
|
+
const parts = str.split(".");
|
|
32
|
+
const numberPart = parts[0];
|
|
33
|
+
const decimalPart = parts[1];
|
|
34
|
+
const endsWithPoint = str.endsWith(".") && str.length > 1;
|
|
35
|
+
const result = numberPart.replace(THOUSANDS_REGEXP, ",") + (decimalPart ? "." + decimalPart.substring(0, fix || decimalPart.length) : endsWithPoint ? "." : "");
|
|
36
|
+
if (fix === 0 && result.includes(".")) {
|
|
37
|
+
return result.substring(0, result.indexOf("."));
|
|
38
|
+
}
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
var SCIENTIFICNOTATION_REGEX = /\d(?:\.(\d*))?e([+-]\d+)/;
|
|
42
|
+
var toNonExponential = (num) => {
|
|
43
|
+
const m = num.toExponential().match(SCIENTIFICNOTATION_REGEX);
|
|
44
|
+
if (!Array.isArray(m)) {
|
|
45
|
+
return num;
|
|
46
|
+
}
|
|
47
|
+
return num.toFixed(
|
|
48
|
+
Math.max(0, (m[1] || "").length - m[2])
|
|
49
|
+
);
|
|
50
|
+
};
|
|
51
|
+
var getPrecisionByNumber = (num) => {
|
|
52
|
+
num = toNonExponential(Number(num));
|
|
53
|
+
const parts = num.toString().split(".");
|
|
54
|
+
return parts[1] ? parts[1].length : 0;
|
|
55
|
+
};
|
|
56
|
+
function numberToHumanStyle(number, decimalPlaces = 2, options) {
|
|
57
|
+
const { padding } = options || {};
|
|
58
|
+
const abbreviations = ["", "K", "M", "B", "T"];
|
|
59
|
+
let index = 0;
|
|
60
|
+
while (number >= 1e3 && index < abbreviations.length - 1) {
|
|
61
|
+
number /= 1e3;
|
|
62
|
+
index++;
|
|
63
|
+
}
|
|
64
|
+
const roundedNumber = new Decimal(number).toFixed(decimalPlaces, Decimal.ROUND_DOWN).toString().replace(/\.0+$/, "");
|
|
65
|
+
return `${roundedNumber}${abbreviations[index]}`;
|
|
66
|
+
}
|
|
67
|
+
function parseNumStr(str) {
|
|
68
|
+
const value = str.toString();
|
|
69
|
+
const cleanedStr = value.replace(/,/g, "");
|
|
70
|
+
const numberPart = new Decimal(cleanedStr);
|
|
71
|
+
const unitPart = cleanedStr.slice(-1);
|
|
72
|
+
if (Number.isNaN(numberPart.toNumber())) {
|
|
73
|
+
return void 0;
|
|
74
|
+
}
|
|
75
|
+
let result;
|
|
76
|
+
switch (unitPart) {
|
|
77
|
+
case "k":
|
|
78
|
+
case "K":
|
|
79
|
+
result = numberPart.mul(1e3);
|
|
80
|
+
break;
|
|
81
|
+
case "m":
|
|
82
|
+
case "M":
|
|
83
|
+
result = numberPart.mul(1e6);
|
|
84
|
+
break;
|
|
85
|
+
case "b":
|
|
86
|
+
case "B":
|
|
87
|
+
result = numberPart.mul(1e9);
|
|
88
|
+
break;
|
|
89
|
+
case "t":
|
|
90
|
+
case "T":
|
|
91
|
+
result = numberPart.mul(1e12);
|
|
92
|
+
break;
|
|
93
|
+
default:
|
|
94
|
+
result = numberPart;
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
var SCIENTIFICNOTATIONPATTERN = /^[-+]?[0-9]+(\.[0-9]+)?[eE][-+]?[0-9]+$/;
|
|
99
|
+
var TRAILINGZERODECIMAL_REGEX = /(\.[0-9]*[1-9])0+$/;
|
|
100
|
+
var removeTrailingZeros = (value, fixedCount = 16) => {
|
|
101
|
+
const text = `${value}`;
|
|
102
|
+
const isScientific = SCIENTIFICNOTATIONPATTERN.test(text);
|
|
103
|
+
if (!value.toString().includes(".") && !isScientific) {
|
|
104
|
+
return `${value}`;
|
|
105
|
+
}
|
|
106
|
+
const formattedNumber = new Decimal(value).toFixed(fixedCount).replace(TRAILINGZERODECIMAL_REGEX, "$1");
|
|
107
|
+
return formattedNumber;
|
|
108
|
+
};
|
|
109
|
+
var todpIfNeed = (value, dp) => {
|
|
110
|
+
if (value === void 0 || value === "") {
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
if (typeof value === "number") {
|
|
114
|
+
value = value.toString();
|
|
115
|
+
}
|
|
116
|
+
if (value.endsWith(".")) {
|
|
117
|
+
return value;
|
|
118
|
+
}
|
|
119
|
+
const numbers = value.split(".");
|
|
120
|
+
if (numbers.length === 1) {
|
|
121
|
+
return value;
|
|
122
|
+
}
|
|
123
|
+
if (numbers[1].length <= dp || !numbers[1]) {
|
|
124
|
+
return value;
|
|
125
|
+
}
|
|
126
|
+
return `${numbers[0]}.${numbers[1].substring(0, dp)}`;
|
|
127
|
+
};
|
|
128
|
+
var checkIsNaN = (value) => {
|
|
129
|
+
if (value === void 0 || value === "" || value === null) {
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
return Number.isNaN(Number(value));
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// src/dateTime.ts
|
|
136
|
+
var timeConvertString = (time) => {
|
|
137
|
+
time /= 1e3;
|
|
138
|
+
const h = Math.floor(time / 3600);
|
|
139
|
+
const m = Math.floor(time / 60 % 60);
|
|
140
|
+
const s = Math.floor(time % 60);
|
|
141
|
+
return [h, m, s];
|
|
142
|
+
};
|
|
143
|
+
var timestampToString = (timestamp) => {
|
|
144
|
+
const date = new Date(timestamp);
|
|
145
|
+
const year = date.getFullYear();
|
|
146
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
147
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
148
|
+
const hours = String(date.getHours()).padStart(2, "0");
|
|
149
|
+
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
150
|
+
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
151
|
+
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
152
|
+
};
|
|
153
|
+
function subtractDaysFromCurrentDate(days, startDate) {
|
|
154
|
+
const currentDate = startDate || /* @__PURE__ */ new Date();
|
|
155
|
+
const resultDate = new Date(currentDate);
|
|
156
|
+
resultDate.setDate(currentDate.getDate() - days);
|
|
157
|
+
return resultDate;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// src/chain.ts
|
|
161
|
+
import {
|
|
162
|
+
ABSTRACT_TESTNET_CHAINID,
|
|
163
|
+
ARBITRUM_TESTNET_CHAINID,
|
|
164
|
+
BSC_TESTNET_CHAINID,
|
|
165
|
+
MONAD_TESTNET_CHAINID,
|
|
166
|
+
SOLANA_TESTNET_CHAINID,
|
|
167
|
+
STORY_TESTNET_CHAINID,
|
|
168
|
+
SOLANA_MAINNET_CHAINID
|
|
169
|
+
} from "@kodiak-finance/orderly-types";
|
|
170
|
+
var hex2int = (chainId) => parseInt(chainId);
|
|
171
|
+
var int2hex = (chainId) => `0x${chainId.toString(16)}`;
|
|
172
|
+
var praseChainId = (chainId) => {
|
|
173
|
+
if (typeof chainId === "string")
|
|
174
|
+
return hex2int(chainId);
|
|
175
|
+
return chainId;
|
|
176
|
+
};
|
|
177
|
+
var praseChainIdToNumber = (chainId) => {
|
|
178
|
+
if (typeof chainId === "string" && chainId.startsWith("0x") && /^[a-f0-9]+$/iu.test(chainId.slice(2)))
|
|
179
|
+
return hex2int(chainId);
|
|
180
|
+
return chainId;
|
|
181
|
+
};
|
|
182
|
+
var parseChainIdToNumber = praseChainIdToNumber;
|
|
183
|
+
var isTestnet = (chainId) => {
|
|
184
|
+
const testnetIds = [
|
|
185
|
+
ARBITRUM_TESTNET_CHAINID,
|
|
186
|
+
SOLANA_TESTNET_CHAINID,
|
|
187
|
+
STORY_TESTNET_CHAINID,
|
|
188
|
+
MONAD_TESTNET_CHAINID,
|
|
189
|
+
ABSTRACT_TESTNET_CHAINID,
|
|
190
|
+
BSC_TESTNET_CHAINID
|
|
191
|
+
];
|
|
192
|
+
return testnetIds.includes(chainId);
|
|
193
|
+
};
|
|
194
|
+
var isSolana = (chainId) => {
|
|
195
|
+
return [SOLANA_TESTNET_CHAINID, SOLANA_MAINNET_CHAINID].includes(chainId);
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// src/string.ts
|
|
199
|
+
function capitalizeString(str) {
|
|
200
|
+
const lowercaseStr = str.toLowerCase();
|
|
201
|
+
const capitalizedStr = lowercaseStr.charAt(0).toUpperCase() + lowercaseStr.slice(1);
|
|
202
|
+
return capitalizedStr;
|
|
203
|
+
}
|
|
204
|
+
function transSymbolformString(input) {
|
|
205
|
+
const parts = input.split("_");
|
|
206
|
+
if (parts.length !== 3) {
|
|
207
|
+
throw new Error("Invalid string format");
|
|
208
|
+
}
|
|
209
|
+
const [first, second, third] = parts;
|
|
210
|
+
if (!first.startsWith("PERP")) {
|
|
211
|
+
throw new Error("Invalid string format");
|
|
212
|
+
}
|
|
213
|
+
const result = `${second}-${first}`;
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
function camelCaseToUnderscoreCase(str) {
|
|
217
|
+
return str.replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase();
|
|
218
|
+
}
|
|
219
|
+
var findLongestCommonSubString = (str1, str2) => {
|
|
220
|
+
for (let index = 0; index < str1.length; index++) {
|
|
221
|
+
const ele1 = str1.at(index);
|
|
222
|
+
const ele2 = str2.at(index);
|
|
223
|
+
if (ele1 === ele2) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
return index;
|
|
227
|
+
}
|
|
228
|
+
return -1;
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
// src/window.ts
|
|
232
|
+
var windowGuard = (cb) => {
|
|
233
|
+
if (typeof window !== "undefined") {
|
|
234
|
+
cb();
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
var getGlobalObject = () => {
|
|
238
|
+
if (typeof globalThis !== "undefined") {
|
|
239
|
+
return globalThis;
|
|
240
|
+
}
|
|
241
|
+
if (typeof self !== "undefined") {
|
|
242
|
+
return self;
|
|
243
|
+
}
|
|
244
|
+
if (typeof window !== "undefined") {
|
|
245
|
+
return window;
|
|
246
|
+
}
|
|
247
|
+
if (typeof global !== "undefined") {
|
|
248
|
+
return global;
|
|
249
|
+
}
|
|
250
|
+
throw new Error("cannot find the global object");
|
|
251
|
+
};
|
|
252
|
+
var getTimestamp = () => {
|
|
253
|
+
var _a;
|
|
254
|
+
if (typeof window !== "undefined") {
|
|
255
|
+
const timeOffset = (_a = getGlobalObject()) == null ? void 0 : _a.__ORDERLY_timestamp_offset;
|
|
256
|
+
if (typeof timeOffset === "number") {
|
|
257
|
+
return Date.now() + (timeOffset || 0);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return Date.now();
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// src/index.ts
|
|
264
|
+
import { default as default2 } from "dayjs";
|
|
265
|
+
|
|
266
|
+
// src/symbol.ts
|
|
267
|
+
function formatSymbol(symbol, formatString = "base-type") {
|
|
268
|
+
if (!symbol) {
|
|
269
|
+
return "";
|
|
270
|
+
}
|
|
271
|
+
const arr = symbol.split("_");
|
|
272
|
+
const type = arr[0];
|
|
273
|
+
const base = arr[1];
|
|
274
|
+
const quote = arr[2];
|
|
275
|
+
return formatString.replace("type", type).replace("base", base).replace("quote", quote);
|
|
276
|
+
}
|
|
277
|
+
function optimizeSymbolDisplay(symbol, decimalPlaces = 0) {
|
|
278
|
+
if (!symbol) {
|
|
279
|
+
return "";
|
|
280
|
+
}
|
|
281
|
+
const numberRegex = /^(\d+(?:\.\d+)?)/;
|
|
282
|
+
const match = symbol.match(numberRegex);
|
|
283
|
+
if (!match) {
|
|
284
|
+
return symbol;
|
|
285
|
+
}
|
|
286
|
+
const numberPart = match[1];
|
|
287
|
+
const textPart = symbol.slice(numberPart.length);
|
|
288
|
+
const numericValue = parseFloat(numberPart);
|
|
289
|
+
if (numericValue < 1e3) {
|
|
290
|
+
return symbol;
|
|
291
|
+
}
|
|
292
|
+
const abbreviatedNumber = numberToHumanStyle(numericValue, decimalPlaces);
|
|
293
|
+
return abbreviatedNumber + textPart;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// src/order.ts
|
|
297
|
+
import {
|
|
298
|
+
BBOOrderType,
|
|
299
|
+
OrderLevel,
|
|
300
|
+
OrderSide,
|
|
301
|
+
OrderType
|
|
302
|
+
} from "@kodiak-finance/orderly-types";
|
|
303
|
+
function getTrailingStopPrice(order) {
|
|
304
|
+
const { side, extreme_price, callback_value, callback_rate } = order;
|
|
305
|
+
const isBuy = side === OrderSide.BUY;
|
|
306
|
+
if (!extreme_price) {
|
|
307
|
+
return 0;
|
|
308
|
+
}
|
|
309
|
+
if (callback_value) {
|
|
310
|
+
return isBuy ? new decimal_default(extreme_price).plus(callback_value).toNumber() : new decimal_default(extreme_price).minus(callback_value).toNumber();
|
|
311
|
+
}
|
|
312
|
+
if (callback_rate) {
|
|
313
|
+
return isBuy ? new decimal_default(extreme_price).mul(new decimal_default(1).plus(callback_rate)).toNumber() : new decimal_default(extreme_price).mul(new decimal_default(1).minus(callback_rate)).toNumber();
|
|
314
|
+
}
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
function getBBOType(options) {
|
|
318
|
+
const { type, side, level } = options;
|
|
319
|
+
if (type === OrderType.ASK) {
|
|
320
|
+
if (level === OrderLevel.ONE) {
|
|
321
|
+
return side === OrderSide.BUY ? BBOOrderType.COUNTERPARTY1 : BBOOrderType.QUEUE1;
|
|
322
|
+
}
|
|
323
|
+
if (level === OrderLevel.FIVE) {
|
|
324
|
+
return side === OrderSide.BUY ? BBOOrderType.COUNTERPARTY5 : BBOOrderType.QUEUE5;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (type === OrderType.BID) {
|
|
328
|
+
if (level === OrderLevel.ONE) {
|
|
329
|
+
return side === OrderSide.BUY ? BBOOrderType.QUEUE1 : BBOOrderType.COUNTERPARTY1;
|
|
330
|
+
}
|
|
331
|
+
if (level === OrderLevel.FIVE) {
|
|
332
|
+
return side === OrderSide.BUY ? BBOOrderType.QUEUE5 : BBOOrderType.COUNTERPARTY5;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function getTPSLDirection(inputs) {
|
|
337
|
+
const { side, type, closePrice, orderPrice } = inputs;
|
|
338
|
+
let direction = 1;
|
|
339
|
+
if (side === OrderSide.BUY) {
|
|
340
|
+
if (type === "tp") {
|
|
341
|
+
direction = closePrice >= orderPrice ? 1 : -1;
|
|
342
|
+
} else {
|
|
343
|
+
direction = closePrice < orderPrice ? -1 : 1;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
if (side === OrderSide.SELL) {
|
|
347
|
+
if (type === "tp") {
|
|
348
|
+
direction = closePrice <= orderPrice ? 1 : -1;
|
|
349
|
+
} else {
|
|
350
|
+
direction = closePrice > orderPrice ? -1 : 1;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return direction;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// src/formatNum.ts
|
|
357
|
+
function formatNum(type, dp = 2, num, rm) {
|
|
358
|
+
const decimalNum = parseToDecimal(num);
|
|
359
|
+
if (!decimalNum) {
|
|
360
|
+
return void 0;
|
|
361
|
+
}
|
|
362
|
+
const isMoreThanZero = decimalNum.greaterThan(0);
|
|
363
|
+
switch (type) {
|
|
364
|
+
case 0 /* pnl */:
|
|
365
|
+
case 2 /* roi */:
|
|
366
|
+
const innerRm = rm != null ? rm : isMoreThanZero ? decimal_default.ROUND_DOWN : decimal_default.ROUND_UP;
|
|
367
|
+
return format(decimalNum, dp, innerRm);
|
|
368
|
+
case 1 /* notional */:
|
|
369
|
+
return format(decimalNum, dp, rm != null ? rm : decimal_default.ROUND_DOWN);
|
|
370
|
+
case 3 /* assetValue */:
|
|
371
|
+
return format(decimalNum, dp, rm != null ? rm : decimal_default.ROUND_DOWN);
|
|
372
|
+
case 4 /* collateral */:
|
|
373
|
+
return format(decimalNum, dp, rm != null ? rm : decimal_default.ROUND_DOWN);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
function format(num, dp, rm) {
|
|
377
|
+
return num.toDecimalPlaces(dp, rm);
|
|
378
|
+
}
|
|
379
|
+
function parseToDecimal(num) {
|
|
380
|
+
try {
|
|
381
|
+
if (num instanceof decimal_default) {
|
|
382
|
+
return num;
|
|
383
|
+
}
|
|
384
|
+
if (!num) {
|
|
385
|
+
return void 0;
|
|
386
|
+
}
|
|
387
|
+
if (typeof num === "number") {
|
|
388
|
+
return new decimal_default(num);
|
|
389
|
+
}
|
|
390
|
+
if (typeof num === "string") {
|
|
391
|
+
if (!num.trim()) {
|
|
392
|
+
return void 0;
|
|
393
|
+
}
|
|
394
|
+
return new decimal_default(num);
|
|
395
|
+
}
|
|
396
|
+
return num;
|
|
397
|
+
} catch (error) {
|
|
398
|
+
return void 0;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
var formatNumWithNamespace = formatNum;
|
|
402
|
+
formatNumWithNamespace.pnl = (num) => {
|
|
403
|
+
return formatNum(0 /* pnl */, 2, num);
|
|
404
|
+
};
|
|
405
|
+
formatNumWithNamespace.notional = (num) => {
|
|
406
|
+
return formatNum(1 /* notional */, 2, num);
|
|
407
|
+
};
|
|
408
|
+
formatNumWithNamespace.roi = (num, dp) => {
|
|
409
|
+
return formatNum(2 /* roi */, dp != null ? dp : 4, num);
|
|
410
|
+
};
|
|
411
|
+
formatNumWithNamespace.assetValue = (num) => {
|
|
412
|
+
return formatNum(3 /* assetValue */, 2, num);
|
|
413
|
+
};
|
|
414
|
+
formatNumWithNamespace.collateral = (num) => {
|
|
415
|
+
return formatNum(4 /* collateral */, 2, num);
|
|
416
|
+
};
|
|
417
|
+
export {
|
|
418
|
+
decimal_default as Decimal,
|
|
419
|
+
camelCaseToUnderscoreCase,
|
|
420
|
+
capitalizeString,
|
|
421
|
+
checkIsNaN,
|
|
422
|
+
commify,
|
|
423
|
+
commifyOptional,
|
|
424
|
+
cutNumber,
|
|
425
|
+
default2 as dayjs,
|
|
426
|
+
findLongestCommonSubString,
|
|
427
|
+
formatNumWithNamespace as formatNum,
|
|
428
|
+
formatSymbol,
|
|
429
|
+
getBBOType,
|
|
430
|
+
getGlobalObject,
|
|
431
|
+
getPrecisionByNumber,
|
|
432
|
+
getTPSLDirection,
|
|
433
|
+
getTimestamp,
|
|
434
|
+
getTrailingStopPrice,
|
|
435
|
+
hex2int,
|
|
436
|
+
int2hex,
|
|
437
|
+
isSolana,
|
|
438
|
+
isTestnet,
|
|
439
|
+
numberToHumanStyle,
|
|
440
|
+
optimizeSymbolDisplay,
|
|
441
|
+
parseChainIdToNumber,
|
|
442
|
+
parseNumStr,
|
|
443
|
+
praseChainId,
|
|
444
|
+
praseChainIdToNumber,
|
|
445
|
+
removeTrailingZeros,
|
|
446
|
+
subtractDaysFromCurrentDate,
|
|
447
|
+
timeConvertString,
|
|
448
|
+
timestampToString,
|
|
449
|
+
toNonExponential,
|
|
450
|
+
todpIfNeed,
|
|
451
|
+
transSymbolformString,
|
|
452
|
+
windowGuard,
|
|
453
|
+
zero
|
|
454
|
+
};
|
|
2
455
|
//# sourceMappingURL=index.mjs.map
|