@kodiak-finance/orderly-utils 2.8.33 → 2.9.0-rc.2

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 CHANGED
@@ -29,6 +29,14 @@ declare function parseNumStr(str: string | number): Decimal | undefined;
29
29
  declare const removeTrailingZeros: (value: number, fixedCount?: number) => string;
30
30
  declare const todpIfNeed: (value: string | number, dp: number) => string;
31
31
  declare const checkIsNaN: (value: string | number | undefined | null) => boolean;
32
+ /**
33
+ * Format number for display: use decimal places when >= 1, otherwise significant digits.
34
+ * Returns number when >= 1, string when < 1 (to preserve leading zeros in small numbers).
35
+ * @example
36
+ * formatWithPrecision(new Decimal(0.0000000123456), 2) => 0.000000012
37
+ * formatWithPrecision(new Decimal(1.23456), 2) => 1.23
38
+ */
39
+ declare const formatWithPrecision: (num: number | string | Decimal, precision?: number) => number | string;
32
40
 
33
41
  declare const timeConvertString: (time: number) => number[];
34
42
  declare const timestampToString: (timestamp: number) => string;
@@ -190,4 +198,4 @@ declare const getPositionHistoryExportColumns: () => CSVColumnConfig[];
190
198
  declare const getLiquidationExportColumns: () => CSVColumnConfig[];
191
199
  declare const exportToCSVFile: (options: ExportOptions) => void;
192
200
 
193
- export { type ExportOptions, camelCaseToUnderscoreCase, capitalizeString, checkIsNaN, commify, commifyOptional, cutNumber, downloadCSV, exportToCSVFile, findLongestCommonSubString, formatNumWithNamespace as formatNum, formatNumber, formatPercent, formatSymbol, formatTimestamp, generateCSV, getBBOType, getGlobalObject, getLiquidationExportColumns, getOrderExportColumns, getPositionExportColumns, getPositionHistoryExportColumns, getPrecisionByNumber, getTPSLDirection, getTimestamp, getTrailingStopPrice, hex2int, int2hex, isSolana, isTestnet, numberToHumanStyle, optimizeSymbolDisplay, parseChainIdToNumber, parseNumStr, praseChainId, praseChainIdToNumber, removeTrailingZeros, subtractDaysFromCurrentDate, timeConvertString, timestampToString, toNonExponential, todpIfNeed, transSymbolformString, windowGuard, zero };
201
+ export { type ExportOptions, camelCaseToUnderscoreCase, capitalizeString, checkIsNaN, commify, commifyOptional, cutNumber, downloadCSV, exportToCSVFile, findLongestCommonSubString, formatNumWithNamespace as formatNum, formatNumber, formatPercent, formatSymbol, formatTimestamp, formatWithPrecision, generateCSV, getBBOType, getGlobalObject, getLiquidationExportColumns, getOrderExportColumns, getPositionExportColumns, getPositionHistoryExportColumns, getPrecisionByNumber, getTPSLDirection, getTimestamp, getTrailingStopPrice, hex2int, int2hex, isSolana, isTestnet, numberToHumanStyle, optimizeSymbolDisplay, parseChainIdToNumber, parseNumStr, praseChainId, praseChainIdToNumber, removeTrailingZeros, subtractDaysFromCurrentDate, timeConvertString, timestampToString, toNonExponential, todpIfNeed, transSymbolformString, windowGuard, zero };
package/dist/index.d.ts CHANGED
@@ -29,6 +29,14 @@ declare function parseNumStr(str: string | number): Decimal | undefined;
29
29
  declare const removeTrailingZeros: (value: number, fixedCount?: number) => string;
30
30
  declare const todpIfNeed: (value: string | number, dp: number) => string;
31
31
  declare const checkIsNaN: (value: string | number | undefined | null) => boolean;
32
+ /**
33
+ * Format number for display: use decimal places when >= 1, otherwise significant digits.
34
+ * Returns number when >= 1, string when < 1 (to preserve leading zeros in small numbers).
35
+ * @example
36
+ * formatWithPrecision(new Decimal(0.0000000123456), 2) => 0.000000012
37
+ * formatWithPrecision(new Decimal(1.23456), 2) => 1.23
38
+ */
39
+ declare const formatWithPrecision: (num: number | string | Decimal, precision?: number) => number | string;
32
40
 
33
41
  declare const timeConvertString: (time: number) => number[];
34
42
  declare const timestampToString: (timestamp: number) => string;
@@ -190,4 +198,4 @@ declare const getPositionHistoryExportColumns: () => CSVColumnConfig[];
190
198
  declare const getLiquidationExportColumns: () => CSVColumnConfig[];
191
199
  declare const exportToCSVFile: (options: ExportOptions) => void;
192
200
 
193
- export { type ExportOptions, camelCaseToUnderscoreCase, capitalizeString, checkIsNaN, commify, commifyOptional, cutNumber, downloadCSV, exportToCSVFile, findLongestCommonSubString, formatNumWithNamespace as formatNum, formatNumber, formatPercent, formatSymbol, formatTimestamp, generateCSV, getBBOType, getGlobalObject, getLiquidationExportColumns, getOrderExportColumns, getPositionExportColumns, getPositionHistoryExportColumns, getPrecisionByNumber, getTPSLDirection, getTimestamp, getTrailingStopPrice, hex2int, int2hex, isSolana, isTestnet, numberToHumanStyle, optimizeSymbolDisplay, parseChainIdToNumber, parseNumStr, praseChainId, praseChainIdToNumber, removeTrailingZeros, subtractDaysFromCurrentDate, timeConvertString, timestampToString, toNonExponential, todpIfNeed, transSymbolformString, windowGuard, zero };
201
+ export { type ExportOptions, camelCaseToUnderscoreCase, capitalizeString, checkIsNaN, commify, commifyOptional, cutNumber, downloadCSV, exportToCSVFile, findLongestCommonSubString, formatNumWithNamespace as formatNum, formatNumber, formatPercent, formatSymbol, formatTimestamp, formatWithPrecision, generateCSV, getBBOType, getGlobalObject, getLiquidationExportColumns, getOrderExportColumns, getPositionExportColumns, getPositionHistoryExportColumns, getPrecisionByNumber, getTPSLDirection, getTimestamp, getTrailingStopPrice, hex2int, int2hex, isSolana, isTestnet, numberToHumanStyle, optimizeSymbolDisplay, parseChainIdToNumber, parseNumStr, praseChainId, praseChainIdToNumber, removeTrailingZeros, subtractDaysFromCurrentDate, timeConvertString, timestampToString, toNonExponential, todpIfNeed, transSymbolformString, windowGuard, zero };
package/dist/index.js CHANGED
@@ -46,6 +46,7 @@ __export(index_exports, {
46
46
  formatPercent: () => formatPercent,
47
47
  formatSymbol: () => formatSymbol,
48
48
  formatTimestamp: () => formatTimestamp,
49
+ formatWithPrecision: () => formatWithPrecision,
49
50
  generateCSV: () => generateCSV,
50
51
  getBBOType: () => getBBOType,
51
52
  getGlobalObject: () => getGlobalObject,
@@ -212,6 +213,13 @@ var checkIsNaN = (value) => {
212
213
  }
213
214
  return Number.isNaN(Number(value));
214
215
  };
216
+ var formatWithPrecision = (num, precision = 2) => {
217
+ const numDecimal = new import_decimal.default(num || 0);
218
+ if (numDecimal.gte(1)) {
219
+ return numDecimal.todp(precision, import_decimal.default.ROUND_DOWN).toNumber();
220
+ }
221
+ return numDecimal.toSignificantDigits(precision, import_decimal.default.ROUND_DOWN).toFixed();
222
+ };
215
223
 
216
224
  // src/dateTime.ts
217
225
  var timeConvertString = (time) => {
@@ -966,6 +974,7 @@ var exportToCSVFile = (options) => {
966
974
  formatPercent,
967
975
  formatSymbol,
968
976
  formatTimestamp,
977
+ formatWithPrecision,
969
978
  generateCSV,
970
979
  getBBOType,
971
980
  getGlobalObject,
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","../src/formatNum.ts","../src/csvExport.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\";\nexport * from \"./csvExport\";\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","/**\n * CSV Export Service\n * Handles CSV generation for positions, position history, and liquidations with proper formatting and column mapping.\n * Shared by trading and portfolio packages.\n */\n\ninterface CSVColumnConfig {\n key: string;\n title: string;\n formatter?: (value: any) => string | number;\n}\n\nexport interface ExportOptions {\n filename: string;\n columns: CSVColumnConfig[];\n data: any[];\n}\n\n/**\n * Convert data to CSV format\n */\nexport const generateCSV = (options: ExportOptions): string => {\n const { columns, data } = options;\n\n // Create header row\n const headers = columns.map((col) => `\"${col.title}\"`).join(\",\");\n\n // Create data rows\n const rows = data.map((row) => {\n return columns\n .map((col) => {\n let value = row[col.key];\n\n // Apply formatter if provided\n if (col.formatter) {\n value = col.formatter(value);\n }\n\n // Escape quotes and wrap in quotes\n const stringValue = String(value ?? \"\");\n const escapedValue = stringValue.replace(/\"/g, '\"\"');\n return `\"${escapedValue}\"`;\n })\n .join(\",\");\n });\n\n return [headers, ...rows].join(\"\\n\");\n};\n\n/**\n * Trigger browser download\n */\nexport const downloadCSV = (csv: string, filename: string) => {\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", `${filename}.csv`);\n link.style.visibility = \"hidden\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * Format timestamp to readable date\n */\nexport const formatTimestamp = (timestamp: number | string): string => {\n if (!timestamp) return \"--\";\n const numTimestamp = Number(timestamp);\n // Check if timestamp is in milliseconds or seconds\n const date = new Date(\n numTimestamp > 10000000000 ? numTimestamp : numTimestamp * 1000,\n );\n return (\n date.toISOString().split(\"T\")[0] + \" \" + date.toTimeString().slice(0, 8)\n );\n};\n\n/**\n * Format number with decimal precision\n */\nexport const formatNumber = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return num.toFixed(decimals);\n};\n\n/**\n * Format percentage\n */\nexport const formatPercent = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return (num * 100).toFixed(decimals) + \"%\";\n};\n\n// ============================================\n// POSITIONS EXPORT\n// ============================================\n\nexport const getPositionExportColumns = (): CSVColumnConfig[] => [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"settle_price\",\n title: \"Settle Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"est_liq_price\",\n title: \"Est. Liquidation Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"cost_position\",\n title: \"Cost Position\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"unsettled_pnl\",\n title: \"Unsettled PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"pnl_24_h\",\n title: \"PnL 24h\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"imr\",\n title: \"Initial Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"mmr\",\n title: \"Maintenance Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"IMR_withdraw_orders\",\n title: \"IMR with Withdraw Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"MMR_with_orders\",\n title: \"MMR with Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"pending_long_qty\",\n title: \"Pending Long Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"pending_short_qty\",\n title: \"Pending Short Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"last_sum_unitary_funding\",\n title: \"Last Sum Unitary Funding\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"fee_24_h\",\n title: \"Fee 24h\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"seq\",\n title: \"Sequence\",\n },\n {\n key: \"timestamp\",\n title: \"Timestamp\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// ORDERS EXPORT\n// ============================================\n\nexport const getOrderExportColumns = (tabType: string): CSVColumnConfig[] => {\n // Order History has a different set of fields than pending/filled orders\n if (tabType === \"orderHistory\") {\n return [\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n }\n\n // Pending and Filled orders columns\n const baseColumns: CSVColumnConfig[] = [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n {\n key: \"user_id\",\n title: \"User ID\",\n },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"price\",\n title: \"Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible\",\n title: \"Visible\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"executed\",\n title: \"Executed\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"amount\",\n title: \"Amount\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 2)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n\n // Add TP/SL specific columns for tp_sl tab\n if (tabType === \"tp_sl\") {\n baseColumns.splice(6, 0, {\n key: \"trigger_price\",\n title: \"Trigger Price\",\n formatter: (v) => formatNumber(v, 4),\n });\n }\n\n return baseColumns;\n};\n\n// ============================================\n// POSITION HISTORY EXPORT\n// ============================================\n\nexport const getPositionHistoryExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"position_id\",\n title: \"Position ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_status\",\n title: \"Status\",\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"side\",\n title: \"Side\",\n },\n {\n key: \"closed_position_qty\",\n title: \"Closed Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"max_position_qty\",\n title: \"Max Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"avg_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"avg_close_price\",\n title: \"Avg Close Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"accumulated_funding_fee\",\n title: \"Accumulated Funding Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"trading_fee\",\n title: \"Trading Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"open_timestamp\",\n title: \"Time Opened\",\n formatter: formatTimestamp,\n },\n {\n key: \"close_timestamp\",\n title: \"Time Closed\",\n formatter: (v) => (v ? formatTimestamp(v) : \"--\"),\n },\n {\n key: \"last_update_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// LIQUIDATION EXPORT\n// ============================================\n\nexport const getLiquidationExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"timestamp\",\n title: \"Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"liquidation_id\",\n title: \"Liquidation ID\",\n },\n {\n key: \"symbol\",\n title: \"Symbol\",\n },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"transfer_price\",\n title: \"Transfer Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_liquidation_fee\",\n title: \"Abs Liquidation Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_insurance_fund_fee\",\n title: \"Abs Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"cost_position_transfer\",\n title: \"Cost Position Transfer\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"margin_ratio\",\n title: \"Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"account_mmr\",\n title: \"Account MMR\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"position_notional\",\n title: \"Position Notional\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"collateral_value\",\n title: \"Collateral Value\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"transfer_amount_to_insurance_fund\",\n title: \"Transfer Amount to Insurance Fund\",\n formatter: (v) => formatNumber(v, 2),\n },\n];\n\n// ============================================\n// EXPORT HANDLER\n// ============================================\n\nexport const exportToCSVFile = (options: ExportOptions) => {\n const csv = generateCSV(options);\n downloadCSV(csv, options.filename);\n};\n"],"mappings":"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","names":["Decimal","import_orderly_types"]}
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","../src/csvExport.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\";\nexport * from \"./csvExport\";\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\n/**\n * Format number for display: use decimal places when >= 1, otherwise significant digits.\n * Returns number when >= 1, string when < 1 (to preserve leading zeros in small numbers).\n * @example\n * formatWithPrecision(new Decimal(0.0000000123456), 2) => 0.000000012\n * formatWithPrecision(new Decimal(1.23456), 2) => 1.23\n */\nexport const formatWithPrecision = (\n num: number | string | Decimal,\n precision: number = 2,\n): number | string => {\n const numDecimal = new Decimal(num || 0);\n\n if (numDecimal.gte(1)) {\n return numDecimal.todp(precision, Decimal.ROUND_DOWN).toNumber();\n }\n return numDecimal\n .toSignificantDigits(precision, Decimal.ROUND_DOWN)\n .toFixed();\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","/**\n * CSV Export Service\n * Handles CSV generation for positions, position history, and liquidations with proper formatting and column mapping.\n * Shared by trading and portfolio packages.\n */\n\ninterface CSVColumnConfig {\n key: string;\n title: string;\n formatter?: (value: any) => string | number;\n}\n\nexport interface ExportOptions {\n filename: string;\n columns: CSVColumnConfig[];\n data: any[];\n}\n\n/**\n * Convert data to CSV format\n */\nexport const generateCSV = (options: ExportOptions): string => {\n const { columns, data } = options;\n\n // Create header row\n const headers = columns.map((col) => `\"${col.title}\"`).join(\",\");\n\n // Create data rows\n const rows = data.map((row) => {\n return columns\n .map((col) => {\n let value = row[col.key];\n\n // Apply formatter if provided\n if (col.formatter) {\n value = col.formatter(value);\n }\n\n // Escape quotes and wrap in quotes\n const stringValue = String(value ?? \"\");\n const escapedValue = stringValue.replace(/\"/g, '\"\"');\n return `\"${escapedValue}\"`;\n })\n .join(\",\");\n });\n\n return [headers, ...rows].join(\"\\n\");\n};\n\n/**\n * Trigger browser download\n */\nexport const downloadCSV = (csv: string, filename: string) => {\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", `${filename}.csv`);\n link.style.visibility = \"hidden\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * Format timestamp to readable date\n */\nexport const formatTimestamp = (timestamp: number | string): string => {\n if (!timestamp) return \"--\";\n const numTimestamp = Number(timestamp);\n // Check if timestamp is in milliseconds or seconds\n const date = new Date(\n numTimestamp > 10000000000 ? numTimestamp : numTimestamp * 1000,\n );\n return (\n date.toISOString().split(\"T\")[0] + \" \" + date.toTimeString().slice(0, 8)\n );\n};\n\n/**\n * Format number with decimal precision\n */\nexport const formatNumber = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return num.toFixed(decimals);\n};\n\n/**\n * Format percentage\n */\nexport const formatPercent = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return (num * 100).toFixed(decimals) + \"%\";\n};\n\n// ============================================\n// POSITIONS EXPORT\n// ============================================\n\nexport const getPositionExportColumns = (): CSVColumnConfig[] => [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"settle_price\",\n title: \"Settle Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"est_liq_price\",\n title: \"Est. Liquidation Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"cost_position\",\n title: \"Cost Position\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"unsettled_pnl\",\n title: \"Unsettled PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"pnl_24_h\",\n title: \"PnL 24h\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"imr\",\n title: \"Initial Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"mmr\",\n title: \"Maintenance Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"IMR_withdraw_orders\",\n title: \"IMR with Withdraw Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"MMR_with_orders\",\n title: \"MMR with Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"pending_long_qty\",\n title: \"Pending Long Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"pending_short_qty\",\n title: \"Pending Short Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"last_sum_unitary_funding\",\n title: \"Last Sum Unitary Funding\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"fee_24_h\",\n title: \"Fee 24h\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"seq\",\n title: \"Sequence\",\n },\n {\n key: \"timestamp\",\n title: \"Timestamp\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// ORDERS EXPORT\n// ============================================\n\nexport const getOrderExportColumns = (tabType: string): CSVColumnConfig[] => {\n // Order History has a different set of fields than pending/filled orders\n if (tabType === \"orderHistory\") {\n return [\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n }\n\n // Pending and Filled orders columns\n const baseColumns: CSVColumnConfig[] = [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n {\n key: \"user_id\",\n title: \"User ID\",\n },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"price\",\n title: \"Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible\",\n title: \"Visible\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"executed\",\n title: \"Executed\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"amount\",\n title: \"Amount\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 2)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n\n // Add TP/SL specific columns for tp_sl tab\n if (tabType === \"tp_sl\") {\n baseColumns.splice(6, 0, {\n key: \"trigger_price\",\n title: \"Trigger Price\",\n formatter: (v) => formatNumber(v, 4),\n });\n }\n\n return baseColumns;\n};\n\n// ============================================\n// POSITION HISTORY EXPORT\n// ============================================\n\nexport const getPositionHistoryExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"position_id\",\n title: \"Position ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_status\",\n title: \"Status\",\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"side\",\n title: \"Side\",\n },\n {\n key: \"closed_position_qty\",\n title: \"Closed Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"max_position_qty\",\n title: \"Max Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"avg_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"avg_close_price\",\n title: \"Avg Close Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"accumulated_funding_fee\",\n title: \"Accumulated Funding Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"trading_fee\",\n title: \"Trading Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"open_timestamp\",\n title: \"Time Opened\",\n formatter: formatTimestamp,\n },\n {\n key: \"close_timestamp\",\n title: \"Time Closed\",\n formatter: (v) => (v ? formatTimestamp(v) : \"--\"),\n },\n {\n key: \"last_update_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// LIQUIDATION EXPORT\n// ============================================\n\nexport const getLiquidationExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"timestamp\",\n title: \"Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"liquidation_id\",\n title: \"Liquidation ID\",\n },\n {\n key: \"symbol\",\n title: \"Symbol\",\n },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"transfer_price\",\n title: \"Transfer Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_liquidation_fee\",\n title: \"Abs Liquidation Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_insurance_fund_fee\",\n title: \"Abs Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"cost_position_transfer\",\n title: \"Cost Position Transfer\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"margin_ratio\",\n title: \"Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"account_mmr\",\n title: \"Account MMR\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"position_notional\",\n title: \"Position Notional\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"collateral_value\",\n title: \"Collateral Value\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"transfer_amount_to_insurance_fund\",\n title: \"Transfer Amount to Insurance Fund\",\n formatter: (v) => formatNumber(v, 2),\n },\n];\n\n// ============================================\n// EXPORT HANDLER\n// ============================================\n\nexport const exportToCSVFile = (options: ExportOptions) => {\n const csv = generateCSV(options);\n downloadCSV(csv, options.filename);\n};\n"],"mappings":"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","names":["Decimal","import_orderly_types"]}
package/dist/index.mjs CHANGED
@@ -131,6 +131,13 @@ var checkIsNaN = (value) => {
131
131
  }
132
132
  return Number.isNaN(Number(value));
133
133
  };
134
+ var formatWithPrecision = (num, precision = 2) => {
135
+ const numDecimal = new Decimal(num || 0);
136
+ if (numDecimal.gte(1)) {
137
+ return numDecimal.todp(precision, Decimal.ROUND_DOWN).toNumber();
138
+ }
139
+ return numDecimal.toSignificantDigits(precision, Decimal.ROUND_DOWN).toFixed();
140
+ };
134
141
 
135
142
  // src/dateTime.ts
136
143
  var timeConvertString = (time) => {
@@ -897,6 +904,7 @@ export {
897
904
  formatPercent,
898
905
  formatSymbol,
899
906
  formatTimestamp,
907
+ formatWithPrecision,
900
908
  generateCSV,
901
909
  getBBOType,
902
910
  getGlobalObject,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decimal.ts","../src/dateTime.ts","../src/chain.ts","../src/string.ts","../src/window.ts","../src/index.ts","../src/symbol.ts","../src/order.ts","../src/formatNum.ts","../src/csvExport.ts"],"sourcesContent":["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 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\";\nexport * from \"./csvExport\";\n\n// export { dayjs };\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","/**\n * CSV Export Service\n * Handles CSV generation for positions, position history, and liquidations with proper formatting and column mapping.\n * Shared by trading and portfolio packages.\n */\n\ninterface CSVColumnConfig {\n key: string;\n title: string;\n formatter?: (value: any) => string | number;\n}\n\nexport interface ExportOptions {\n filename: string;\n columns: CSVColumnConfig[];\n data: any[];\n}\n\n/**\n * Convert data to CSV format\n */\nexport const generateCSV = (options: ExportOptions): string => {\n const { columns, data } = options;\n\n // Create header row\n const headers = columns.map((col) => `\"${col.title}\"`).join(\",\");\n\n // Create data rows\n const rows = data.map((row) => {\n return columns\n .map((col) => {\n let value = row[col.key];\n\n // Apply formatter if provided\n if (col.formatter) {\n value = col.formatter(value);\n }\n\n // Escape quotes and wrap in quotes\n const stringValue = String(value ?? \"\");\n const escapedValue = stringValue.replace(/\"/g, '\"\"');\n return `\"${escapedValue}\"`;\n })\n .join(\",\");\n });\n\n return [headers, ...rows].join(\"\\n\");\n};\n\n/**\n * Trigger browser download\n */\nexport const downloadCSV = (csv: string, filename: string) => {\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", `${filename}.csv`);\n link.style.visibility = \"hidden\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * Format timestamp to readable date\n */\nexport const formatTimestamp = (timestamp: number | string): string => {\n if (!timestamp) return \"--\";\n const numTimestamp = Number(timestamp);\n // Check if timestamp is in milliseconds or seconds\n const date = new Date(\n numTimestamp > 10000000000 ? numTimestamp : numTimestamp * 1000,\n );\n return (\n date.toISOString().split(\"T\")[0] + \" \" + date.toTimeString().slice(0, 8)\n );\n};\n\n/**\n * Format number with decimal precision\n */\nexport const formatNumber = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return num.toFixed(decimals);\n};\n\n/**\n * Format percentage\n */\nexport const formatPercent = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return (num * 100).toFixed(decimals) + \"%\";\n};\n\n// ============================================\n// POSITIONS EXPORT\n// ============================================\n\nexport const getPositionExportColumns = (): CSVColumnConfig[] => [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"settle_price\",\n title: \"Settle Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"est_liq_price\",\n title: \"Est. Liquidation Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"cost_position\",\n title: \"Cost Position\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"unsettled_pnl\",\n title: \"Unsettled PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"pnl_24_h\",\n title: \"PnL 24h\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"imr\",\n title: \"Initial Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"mmr\",\n title: \"Maintenance Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"IMR_withdraw_orders\",\n title: \"IMR with Withdraw Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"MMR_with_orders\",\n title: \"MMR with Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"pending_long_qty\",\n title: \"Pending Long Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"pending_short_qty\",\n title: \"Pending Short Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"last_sum_unitary_funding\",\n title: \"Last Sum Unitary Funding\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"fee_24_h\",\n title: \"Fee 24h\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"seq\",\n title: \"Sequence\",\n },\n {\n key: \"timestamp\",\n title: \"Timestamp\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// ORDERS EXPORT\n// ============================================\n\nexport const getOrderExportColumns = (tabType: string): CSVColumnConfig[] => {\n // Order History has a different set of fields than pending/filled orders\n if (tabType === \"orderHistory\") {\n return [\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n }\n\n // Pending and Filled orders columns\n const baseColumns: CSVColumnConfig[] = [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n {\n key: \"user_id\",\n title: \"User ID\",\n },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"price\",\n title: \"Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible\",\n title: \"Visible\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"executed\",\n title: \"Executed\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"amount\",\n title: \"Amount\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 2)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n\n // Add TP/SL specific columns for tp_sl tab\n if (tabType === \"tp_sl\") {\n baseColumns.splice(6, 0, {\n key: \"trigger_price\",\n title: \"Trigger Price\",\n formatter: (v) => formatNumber(v, 4),\n });\n }\n\n return baseColumns;\n};\n\n// ============================================\n// POSITION HISTORY EXPORT\n// ============================================\n\nexport const getPositionHistoryExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"position_id\",\n title: \"Position ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_status\",\n title: \"Status\",\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"side\",\n title: \"Side\",\n },\n {\n key: \"closed_position_qty\",\n title: \"Closed Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"max_position_qty\",\n title: \"Max Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"avg_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"avg_close_price\",\n title: \"Avg Close Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"accumulated_funding_fee\",\n title: \"Accumulated Funding Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"trading_fee\",\n title: \"Trading Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"open_timestamp\",\n title: \"Time Opened\",\n formatter: formatTimestamp,\n },\n {\n key: \"close_timestamp\",\n title: \"Time Closed\",\n formatter: (v) => (v ? formatTimestamp(v) : \"--\"),\n },\n {\n key: \"last_update_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// LIQUIDATION EXPORT\n// ============================================\n\nexport const getLiquidationExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"timestamp\",\n title: \"Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"liquidation_id\",\n title: \"Liquidation ID\",\n },\n {\n key: \"symbol\",\n title: \"Symbol\",\n },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"transfer_price\",\n title: \"Transfer Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_liquidation_fee\",\n title: \"Abs Liquidation Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_insurance_fund_fee\",\n title: \"Abs Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"cost_position_transfer\",\n title: \"Cost Position Transfer\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"margin_ratio\",\n title: \"Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"account_mmr\",\n title: \"Account MMR\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"position_notional\",\n title: \"Position Notional\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"collateral_value\",\n title: \"Collateral Value\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"transfer_amount_to_insurance_fund\",\n title: \"Transfer Amount to Insurance Fund\",\n formatter: (v) => formatNumber(v, 2),\n },\n];\n\n// ============================================\n// EXPORT HANDLER\n// ============================================\n\nexport const exportToCSVFile = (options: ExportOptions) => {\n const csv = generateCSV(options);\n downloadCSV(csv, options.filename);\n};\n"],"mappings":"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","names":["default"]}
1
+ {"version":3,"sources":["../src/decimal.ts","../src/dateTime.ts","../src/chain.ts","../src/string.ts","../src/window.ts","../src/index.ts","../src/symbol.ts","../src/order.ts","../src/formatNum.ts","../src/csvExport.ts"],"sourcesContent":["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\n/**\n * Format number for display: use decimal places when >= 1, otherwise significant digits.\n * Returns number when >= 1, string when < 1 (to preserve leading zeros in small numbers).\n * @example\n * formatWithPrecision(new Decimal(0.0000000123456), 2) => 0.000000012\n * formatWithPrecision(new Decimal(1.23456), 2) => 1.23\n */\nexport const formatWithPrecision = (\n num: number | string | Decimal,\n precision: number = 2,\n): number | string => {\n const numDecimal = new Decimal(num || 0);\n\n if (numDecimal.gte(1)) {\n return numDecimal.todp(precision, Decimal.ROUND_DOWN).toNumber();\n }\n return numDecimal\n .toSignificantDigits(precision, Decimal.ROUND_DOWN)\n .toFixed();\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 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\";\nexport * from \"./csvExport\";\n\n// export { dayjs };\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","/**\n * CSV Export Service\n * Handles CSV generation for positions, position history, and liquidations with proper formatting and column mapping.\n * Shared by trading and portfolio packages.\n */\n\ninterface CSVColumnConfig {\n key: string;\n title: string;\n formatter?: (value: any) => string | number;\n}\n\nexport interface ExportOptions {\n filename: string;\n columns: CSVColumnConfig[];\n data: any[];\n}\n\n/**\n * Convert data to CSV format\n */\nexport const generateCSV = (options: ExportOptions): string => {\n const { columns, data } = options;\n\n // Create header row\n const headers = columns.map((col) => `\"${col.title}\"`).join(\",\");\n\n // Create data rows\n const rows = data.map((row) => {\n return columns\n .map((col) => {\n let value = row[col.key];\n\n // Apply formatter if provided\n if (col.formatter) {\n value = col.formatter(value);\n }\n\n // Escape quotes and wrap in quotes\n const stringValue = String(value ?? \"\");\n const escapedValue = stringValue.replace(/\"/g, '\"\"');\n return `\"${escapedValue}\"`;\n })\n .join(\",\");\n });\n\n return [headers, ...rows].join(\"\\n\");\n};\n\n/**\n * Trigger browser download\n */\nexport const downloadCSV = (csv: string, filename: string) => {\n const blob = new Blob([csv], { type: \"text/csv;charset=utf-8;\" });\n const link = document.createElement(\"a\");\n const url = URL.createObjectURL(blob);\n\n link.setAttribute(\"href\", url);\n link.setAttribute(\"download\", `${filename}.csv`);\n link.style.visibility = \"hidden\";\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * Format timestamp to readable date\n */\nexport const formatTimestamp = (timestamp: number | string): string => {\n if (!timestamp) return \"--\";\n const numTimestamp = Number(timestamp);\n // Check if timestamp is in milliseconds or seconds\n const date = new Date(\n numTimestamp > 10000000000 ? numTimestamp : numTimestamp * 1000,\n );\n return (\n date.toISOString().split(\"T\")[0] + \" \" + date.toTimeString().slice(0, 8)\n );\n};\n\n/**\n * Format number with decimal precision\n */\nexport const formatNumber = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return num.toFixed(decimals);\n};\n\n/**\n * Format percentage\n */\nexport const formatPercent = (value: any, decimals = 2): string => {\n if (value === null || value === undefined) return \"--\";\n const num = Number(value);\n if (isNaN(num)) return \"--\";\n return (num * 100).toFixed(decimals) + \"%\";\n};\n\n// ============================================\n// POSITIONS EXPORT\n// ============================================\n\nexport const getPositionExportColumns = (): CSVColumnConfig[] => [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"settle_price\",\n title: \"Settle Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"est_liq_price\",\n title: \"Est. Liquidation Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"cost_position\",\n title: \"Cost Position\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"unsettled_pnl\",\n title: \"Unsettled PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"pnl_24_h\",\n title: \"PnL 24h\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"imr\",\n title: \"Initial Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"mmr\",\n title: \"Maintenance Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"IMR_withdraw_orders\",\n title: \"IMR with Withdraw Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"MMR_with_orders\",\n title: \"MMR with Orders\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"pending_long_qty\",\n title: \"Pending Long Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"pending_short_qty\",\n title: \"Pending Short Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"last_sum_unitary_funding\",\n title: \"Last Sum Unitary Funding\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"fee_24_h\",\n title: \"Fee 24h\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"seq\",\n title: \"Sequence\",\n },\n {\n key: \"timestamp\",\n title: \"Timestamp\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// ORDERS EXPORT\n// ============================================\n\nexport const getOrderExportColumns = (tabType: string): CSVColumnConfig[] => {\n // Order History has a different set of fields than pending/filled orders\n if (tabType === \"orderHistory\") {\n return [\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n }\n\n // Pending and Filled orders columns\n const baseColumns: CSVColumnConfig[] = [\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"order_id\",\n title: \"Order ID\",\n },\n {\n key: \"user_id\",\n title: \"User ID\",\n },\n { key: \"side\", title: \"Side\" },\n { key: \"type\", title: \"Order Type\" },\n { key: \"status\", title: \"Status\" },\n {\n key: \"price\",\n title: \"Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"quantity\",\n title: \"Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible\",\n title: \"Visible\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"visible_quantity\",\n title: \"Visible Quantity\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"executed\",\n title: \"Executed\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"total_executed_quantity\",\n title: \"Total Executed Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"average_executed_price\",\n title: \"Avg Executed Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"amount\",\n title: \"Amount\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 2)),\n },\n {\n key: \"total_fee\",\n title: \"Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"fee_asset\",\n title: \"Fee Asset\",\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"created_time\",\n title: \"Created Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"updated_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n ];\n\n // Add TP/SL specific columns for tp_sl tab\n if (tabType === \"tp_sl\") {\n baseColumns.splice(6, 0, {\n key: \"trigger_price\",\n title: \"Trigger Price\",\n formatter: (v) => formatNumber(v, 4),\n });\n }\n\n return baseColumns;\n};\n\n// ============================================\n// POSITION HISTORY EXPORT\n// ============================================\n\nexport const getPositionHistoryExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"position_id\",\n title: \"Position ID\",\n },\n { key: \"symbol\", title: \"Symbol\" },\n {\n key: \"position_status\",\n title: \"Status\",\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"side\",\n title: \"Side\",\n },\n {\n key: \"closed_position_qty\",\n title: \"Closed Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"max_position_qty\",\n title: \"Max Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"avg_open_price\",\n title: \"Avg Open Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"avg_close_price\",\n title: \"Avg Close Price\",\n formatter: (v) => (v === null ? \"--\" : formatNumber(v, 4)),\n },\n {\n key: \"realized_pnl\",\n title: \"Realized PnL\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"accumulated_funding_fee\",\n title: \"Accumulated Funding Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"trading_fee\",\n title: \"Trading Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"leverage\",\n title: \"Leverage\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"open_timestamp\",\n title: \"Time Opened\",\n formatter: formatTimestamp,\n },\n {\n key: \"close_timestamp\",\n title: \"Time Closed\",\n formatter: (v) => (v ? formatTimestamp(v) : \"--\"),\n },\n {\n key: \"last_update_time\",\n title: \"Updated Time\",\n formatter: formatTimestamp,\n },\n];\n\n// ============================================\n// LIQUIDATION EXPORT\n// ============================================\n\nexport const getLiquidationExportColumns = (): CSVColumnConfig[] => [\n {\n key: \"timestamp\",\n title: \"Time\",\n formatter: formatTimestamp,\n },\n {\n key: \"type\",\n title: \"Type\",\n },\n {\n key: \"liquidation_id\",\n title: \"Liquidation ID\",\n },\n {\n key: \"symbol\",\n title: \"Symbol\",\n },\n {\n key: \"position_qty\",\n title: \"Position Qty\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"mark_price\",\n title: \"Mark Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"transfer_price\",\n title: \"Transfer Price\",\n formatter: (v) => formatNumber(v, 4),\n },\n {\n key: \"liquidator_fee\",\n title: \"Liquidator Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_liquidation_fee\",\n title: \"Abs Liquidation Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"insurance_fund_fee\",\n title: \"Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 8),\n },\n {\n key: \"abs_insurance_fund_fee\",\n title: \"Abs Insurance Fund Fee\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"cost_position_transfer\",\n title: \"Cost Position Transfer\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"margin_ratio\",\n title: \"Margin Ratio\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"account_mmr\",\n title: \"Account MMR\",\n formatter: (v) => formatPercent(v, 4),\n },\n {\n key: \"position_notional\",\n title: \"Position Notional\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"collateral_value\",\n title: \"Collateral Value\",\n formatter: (v) => formatNumber(v, 2),\n },\n {\n key: \"transfer_amount_to_insurance_fund\",\n title: \"Transfer Amount to Insurance Fund\",\n formatter: (v) => formatNumber(v, 2),\n },\n];\n\n// ============================================\n// EXPORT HANDLER\n// ============================================\n\nexport const exportToCSVFile = (options: ExportOptions) => {\n const csv = generateCSV(options);\n downloadCSV(csv, options.filename);\n};\n"],"mappings":"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","names":["default"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodiak-finance/orderly-utils",
3
- "version": "2.8.33",
3
+ "version": "2.9.0-rc.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -18,12 +18,12 @@
18
18
  "jest": "^29.6.1",
19
19
  "tsup": "^8.5.1",
20
20
  "typescript": "^5.1.6",
21
- "tsconfig": "0.11.32"
21
+ "tsconfig": "0.11.31"
22
22
  },
23
23
  "dependencies": {
24
24
  "dayjs": "^1.11.9",
25
25
  "decimal.js-light": "^2.5.1",
26
- "@kodiak-finance/orderly-types": "2.8.33"
26
+ "@kodiak-finance/orderly-types": "2.9.0-rc.2"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"