@lifi/perps-sdk 23.0.0 → 24.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/README.md +85 -45
  2. package/dist/cjs/client/PerpsClient.d.ts +3 -2
  3. package/dist/cjs/client/PerpsClient.d.ts.map +1 -1
  4. package/dist/cjs/client/PerpsClient.js +16 -9
  5. package/dist/cjs/client/PerpsClient.js.map +1 -1
  6. package/dist/cjs/decimal/arithmetic.d.ts +13 -0
  7. package/dist/cjs/decimal/arithmetic.d.ts.map +1 -0
  8. package/dist/cjs/decimal/arithmetic.js +48 -0
  9. package/dist/cjs/decimal/arithmetic.js.map +1 -0
  10. package/dist/cjs/decimal/big.d.ts +0 -1
  11. package/dist/cjs/decimal/big.d.ts.map +1 -1
  12. package/dist/cjs/decimal/big.js +0 -4
  13. package/dist/cjs/decimal/big.js.map +1 -1
  14. package/dist/cjs/decimal/compare.d.ts +7 -0
  15. package/dist/cjs/decimal/compare.d.ts.map +1 -0
  16. package/dist/cjs/decimal/compare.js +21 -0
  17. package/dist/cjs/decimal/compare.js.map +1 -0
  18. package/dist/cjs/decimal/convert.d.ts +12 -6
  19. package/dist/cjs/decimal/convert.d.ts.map +1 -1
  20. package/dist/cjs/decimal/convert.js +36 -14
  21. package/dist/cjs/decimal/convert.js.map +1 -1
  22. package/dist/cjs/decimal/decimalStringToBig.d.ts +5 -0
  23. package/dist/cjs/decimal/decimalStringToBig.d.ts.map +1 -0
  24. package/dist/cjs/decimal/decimalStringToBig.js +27 -0
  25. package/dist/cjs/decimal/decimalStringToBig.js.map +1 -0
  26. package/dist/cjs/decimal/format.d.ts.map +1 -1
  27. package/dist/cjs/decimal/format.js +70 -49
  28. package/dist/cjs/decimal/format.js.map +1 -1
  29. package/dist/cjs/decimal/parse.d.ts +4 -3
  30. package/dist/cjs/decimal/parse.d.ts.map +1 -1
  31. package/dist/cjs/decimal/parse.js +44 -19
  32. package/dist/cjs/decimal/parse.js.map +1 -1
  33. package/dist/cjs/index.d.ts +13 -10
  34. package/dist/cjs/index.d.ts.map +1 -1
  35. package/dist/cjs/index.js +66 -7
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/cjs/math/fills.d.ts +1 -1
  38. package/dist/cjs/math/fills.d.ts.map +1 -1
  39. package/dist/cjs/math/fills.js +28 -13
  40. package/dist/cjs/math/fills.js.map +1 -1
  41. package/dist/cjs/math/order.d.ts +27 -16
  42. package/dist/cjs/math/order.d.ts.map +1 -1
  43. package/dist/cjs/math/order.js +106 -122
  44. package/dist/cjs/math/order.js.map +1 -1
  45. package/dist/cjs/math/position.d.ts +85 -35
  46. package/dist/cjs/math/position.d.ts.map +1 -1
  47. package/dist/cjs/math/position.js +88 -91
  48. package/dist/cjs/math/position.js.map +1 -1
  49. package/dist/cjs/services/getGasRecommendation.js +1 -1
  50. package/dist/cjs/services/getGasRecommendation.js.map +1 -1
  51. package/dist/cjs/services/getQuote.d.ts +1 -1
  52. package/dist/cjs/services/resolveSubscribeQuote.d.ts.map +1 -1
  53. package/dist/cjs/services/resolveSubscribeQuote.js +3 -2
  54. package/dist/cjs/services/resolveSubscribeQuote.js.map +1 -1
  55. package/dist/cjs/transport/request.d.ts +1 -0
  56. package/dist/cjs/transport/request.d.ts.map +1 -1
  57. package/dist/cjs/transport/request.js +2 -2
  58. package/dist/cjs/transport/request.js.map +1 -1
  59. package/dist/cjs/types/api.d.ts +4 -0
  60. package/dist/cjs/types/api.d.ts.map +1 -1
  61. package/dist/cjs/types/provider.d.ts +9 -5
  62. package/dist/cjs/types/provider.d.ts.map +1 -1
  63. package/dist/cjs/types/withdrawal.d.ts +12 -4
  64. package/dist/cjs/types/withdrawal.d.ts.map +1 -1
  65. package/dist/cjs/utils/createSafeFunction.d.ts +2 -0
  66. package/dist/cjs/utils/createSafeFunction.d.ts.map +1 -0
  67. package/dist/cjs/utils/createSafeFunction.js +15 -0
  68. package/dist/cjs/utils/createSafeFunction.js.map +1 -0
  69. package/dist/cjs/utils/timestampToIsoString.d.ts +3 -0
  70. package/dist/cjs/utils/timestampToIsoString.d.ts.map +1 -0
  71. package/dist/cjs/utils/timestampToIsoString.js +16 -0
  72. package/dist/cjs/utils/timestampToIsoString.js.map +1 -0
  73. package/dist/cjs/utils/warnOnce.d.ts +2 -0
  74. package/dist/cjs/utils/warnOnce.d.ts.map +1 -1
  75. package/dist/cjs/utils/warnOnce.js +13 -1
  76. package/dist/cjs/utils/warnOnce.js.map +1 -1
  77. package/dist/cjs/version.d.ts +1 -1
  78. package/dist/cjs/version.js +1 -1
  79. package/dist/cjs/websocket/PerpsWsClient.d.ts +2 -0
  80. package/dist/cjs/websocket/PerpsWsClient.d.ts.map +1 -1
  81. package/dist/cjs/websocket/PerpsWsClient.js +14 -1
  82. package/dist/cjs/websocket/PerpsWsClient.js.map +1 -1
  83. package/dist/cjs/websocket/wsLog.d.ts +2 -0
  84. package/dist/cjs/websocket/wsLog.d.ts.map +1 -1
  85. package/dist/cjs/websocket/wsLog.js +8 -0
  86. package/dist/cjs/websocket/wsLog.js.map +1 -1
  87. package/dist/cjs/wire/orderAmounts.d.ts.map +1 -1
  88. package/dist/cjs/wire/orderAmounts.js +6 -9
  89. package/dist/cjs/wire/orderAmounts.js.map +1 -1
  90. package/dist/cjs/wire/refuel.d.ts +4 -1
  91. package/dist/cjs/wire/refuel.d.ts.map +1 -1
  92. package/dist/cjs/wire/refuel.js +23 -6
  93. package/dist/cjs/wire/refuel.js.map +1 -1
  94. package/dist/cjs/wire/transferable.js +3 -3
  95. package/dist/cjs/wire/transferable.js.map +1 -1
  96. package/dist/cjs/wire/withdraw.d.ts.map +1 -1
  97. package/dist/cjs/wire/withdraw.js +3 -3
  98. package/dist/cjs/wire/withdraw.js.map +1 -1
  99. package/dist/esm/client/PerpsClient.d.ts +17 -4
  100. package/dist/esm/client/PerpsClient.d.ts.map +1 -1
  101. package/dist/esm/client/PerpsClient.js +30 -8
  102. package/dist/esm/client/PerpsClient.js.map +1 -1
  103. package/dist/esm/decimal/arithmetic.d.ts +84 -0
  104. package/dist/esm/decimal/arithmetic.d.ts.map +1 -0
  105. package/dist/esm/decimal/arithmetic.js +110 -0
  106. package/dist/esm/decimal/arithmetic.js.map +1 -0
  107. package/dist/esm/decimal/big.d.ts +0 -2
  108. package/dist/esm/decimal/big.d.ts.map +1 -1
  109. package/dist/esm/decimal/big.js +0 -4
  110. package/dist/esm/decimal/big.js.map +1 -1
  111. package/dist/esm/decimal/compare.d.ts +45 -0
  112. package/dist/esm/decimal/compare.d.ts.map +1 -0
  113. package/dist/esm/decimal/compare.js +53 -0
  114. package/dist/esm/decimal/compare.js.map +1 -0
  115. package/dist/esm/decimal/convert.d.ts +62 -26
  116. package/dist/esm/decimal/convert.d.ts.map +1 -1
  117. package/dist/esm/decimal/convert.js +76 -25
  118. package/dist/esm/decimal/convert.js.map +1 -1
  119. package/dist/esm/decimal/decimalStringToBig.d.ts +26 -0
  120. package/dist/esm/decimal/decimalStringToBig.d.ts.map +1 -0
  121. package/dist/esm/decimal/decimalStringToBig.js +40 -0
  122. package/dist/esm/decimal/decimalStringToBig.js.map +1 -0
  123. package/dist/esm/decimal/format.d.ts +4 -1
  124. package/dist/esm/decimal/format.d.ts.map +1 -1
  125. package/dist/esm/decimal/format.js +71 -66
  126. package/dist/esm/decimal/format.js.map +1 -1
  127. package/dist/esm/decimal/parse.d.ts +26 -7
  128. package/dist/esm/decimal/parse.d.ts.map +1 -1
  129. package/dist/esm/decimal/parse.js +59 -33
  130. package/dist/esm/decimal/parse.js.map +1 -1
  131. package/dist/esm/index.d.ts +13 -10
  132. package/dist/esm/index.d.ts.map +1 -1
  133. package/dist/esm/index.js +9 -6
  134. package/dist/esm/index.js.map +1 -1
  135. package/dist/esm/math/fills.d.ts +6 -3
  136. package/dist/esm/math/fills.d.ts.map +1 -1
  137. package/dist/esm/math/fills.js +31 -16
  138. package/dist/esm/math/fills.js.map +1 -1
  139. package/dist/esm/math/order.d.ts +85 -65
  140. package/dist/esm/math/order.d.ts.map +1 -1
  141. package/dist/esm/math/order.js +158 -166
  142. package/dist/esm/math/order.js.map +1 -1
  143. package/dist/esm/math/position.d.ts +155 -98
  144. package/dist/esm/math/position.d.ts.map +1 -1
  145. package/dist/esm/math/position.js +157 -155
  146. package/dist/esm/math/position.js.map +1 -1
  147. package/dist/esm/services/getGasRecommendation.js +1 -1
  148. package/dist/esm/services/getGasRecommendation.js.map +1 -1
  149. package/dist/esm/services/getQuote.d.ts +2 -2
  150. package/dist/esm/services/getQuote.js +1 -1
  151. package/dist/esm/services/resolveSubscribeQuote.d.ts +1 -1
  152. package/dist/esm/services/resolveSubscribeQuote.d.ts.map +1 -1
  153. package/dist/esm/services/resolveSubscribeQuote.js +4 -3
  154. package/dist/esm/services/resolveSubscribeQuote.js.map +1 -1
  155. package/dist/esm/transport/request.d.ts +5 -0
  156. package/dist/esm/transport/request.d.ts.map +1 -1
  157. package/dist/esm/transport/request.js +2 -2
  158. package/dist/esm/transport/request.js.map +1 -1
  159. package/dist/esm/types/api.d.ts +9 -0
  160. package/dist/esm/types/api.d.ts.map +1 -1
  161. package/dist/esm/types/provider.d.ts +26 -13
  162. package/dist/esm/types/provider.d.ts.map +1 -1
  163. package/dist/esm/types/withdrawal.d.ts +32 -7
  164. package/dist/esm/types/withdrawal.d.ts.map +1 -1
  165. package/dist/esm/utils/createSafeFunction.d.ts +9 -0
  166. package/dist/esm/utils/createSafeFunction.d.ts.map +1 -0
  167. package/dist/esm/utils/createSafeFunction.js +19 -0
  168. package/dist/esm/utils/createSafeFunction.js.map +1 -0
  169. package/dist/esm/utils/timestampToIsoString.d.ts +15 -0
  170. package/dist/esm/utils/timestampToIsoString.d.ts.map +1 -0
  171. package/dist/esm/utils/timestampToIsoString.js +24 -0
  172. package/dist/esm/utils/timestampToIsoString.js.map +1 -0
  173. package/dist/esm/utils/warnOnce.d.ts +16 -0
  174. package/dist/esm/utils/warnOnce.d.ts.map +1 -1
  175. package/dist/esm/utils/warnOnce.js +24 -0
  176. package/dist/esm/utils/warnOnce.js.map +1 -1
  177. package/dist/esm/version.d.ts +1 -1
  178. package/dist/esm/version.js +1 -1
  179. package/dist/esm/websocket/PerpsWsClient.d.ts +7 -0
  180. package/dist/esm/websocket/PerpsWsClient.d.ts.map +1 -1
  181. package/dist/esm/websocket/PerpsWsClient.js +20 -2
  182. package/dist/esm/websocket/PerpsWsClient.js.map +1 -1
  183. package/dist/esm/websocket/wsLog.d.ts +12 -0
  184. package/dist/esm/websocket/wsLog.d.ts.map +1 -1
  185. package/dist/esm/websocket/wsLog.js +18 -0
  186. package/dist/esm/websocket/wsLog.js.map +1 -1
  187. package/dist/esm/wire/orderAmounts.d.ts.map +1 -1
  188. package/dist/esm/wire/orderAmounts.js +2 -2
  189. package/dist/esm/wire/orderAmounts.js.map +1 -1
  190. package/dist/esm/wire/refuel.d.ts +24 -14
  191. package/dist/esm/wire/refuel.d.ts.map +1 -1
  192. package/dist/esm/wire/refuel.js +38 -17
  193. package/dist/esm/wire/refuel.js.map +1 -1
  194. package/dist/esm/wire/transferable.js +3 -3
  195. package/dist/esm/wire/transferable.js.map +1 -1
  196. package/dist/esm/wire/withdraw.d.ts.map +1 -1
  197. package/dist/esm/wire/withdraw.js +3 -3
  198. package/dist/esm/wire/withdraw.js.map +1 -1
  199. package/dist/types/client/PerpsClient.d.ts +17 -4
  200. package/dist/types/client/PerpsClient.d.ts.map +1 -1
  201. package/dist/types/decimal/arithmetic.d.ts +84 -0
  202. package/dist/types/decimal/arithmetic.d.ts.map +1 -0
  203. package/dist/types/decimal/big.d.ts +0 -2
  204. package/dist/types/decimal/big.d.ts.map +1 -1
  205. package/dist/types/decimal/compare.d.ts +45 -0
  206. package/dist/types/decimal/compare.d.ts.map +1 -0
  207. package/dist/types/decimal/convert.d.ts +62 -26
  208. package/dist/types/decimal/convert.d.ts.map +1 -1
  209. package/dist/types/decimal/decimalStringToBig.d.ts +26 -0
  210. package/dist/types/decimal/decimalStringToBig.d.ts.map +1 -0
  211. package/dist/types/decimal/format.d.ts +4 -1
  212. package/dist/types/decimal/format.d.ts.map +1 -1
  213. package/dist/types/decimal/parse.d.ts +26 -7
  214. package/dist/types/decimal/parse.d.ts.map +1 -1
  215. package/dist/types/index.d.ts +13 -10
  216. package/dist/types/index.d.ts.map +1 -1
  217. package/dist/types/math/fills.d.ts +6 -3
  218. package/dist/types/math/fills.d.ts.map +1 -1
  219. package/dist/types/math/order.d.ts +85 -65
  220. package/dist/types/math/order.d.ts.map +1 -1
  221. package/dist/types/math/position.d.ts +155 -98
  222. package/dist/types/math/position.d.ts.map +1 -1
  223. package/dist/types/services/getQuote.d.ts +2 -2
  224. package/dist/types/services/resolveSubscribeQuote.d.ts +1 -1
  225. package/dist/types/services/resolveSubscribeQuote.d.ts.map +1 -1
  226. package/dist/types/transport/request.d.ts +5 -0
  227. package/dist/types/transport/request.d.ts.map +1 -1
  228. package/dist/types/types/api.d.ts +9 -0
  229. package/dist/types/types/api.d.ts.map +1 -1
  230. package/dist/types/types/provider.d.ts +26 -13
  231. package/dist/types/types/provider.d.ts.map +1 -1
  232. package/dist/types/types/withdrawal.d.ts +32 -7
  233. package/dist/types/types/withdrawal.d.ts.map +1 -1
  234. package/dist/types/utils/createSafeFunction.d.ts +9 -0
  235. package/dist/types/utils/createSafeFunction.d.ts.map +1 -0
  236. package/dist/types/utils/timestampToIsoString.d.ts +15 -0
  237. package/dist/types/utils/timestampToIsoString.d.ts.map +1 -0
  238. package/dist/types/utils/warnOnce.d.ts +16 -0
  239. package/dist/types/utils/warnOnce.d.ts.map +1 -1
  240. package/dist/types/version.d.ts +1 -1
  241. package/dist/types/websocket/PerpsWsClient.d.ts +7 -0
  242. package/dist/types/websocket/PerpsWsClient.d.ts.map +1 -1
  243. package/dist/types/websocket/wsLog.d.ts +12 -0
  244. package/dist/types/websocket/wsLog.d.ts.map +1 -1
  245. package/dist/types/wire/orderAmounts.d.ts.map +1 -1
  246. package/dist/types/wire/refuel.d.ts +24 -14
  247. package/dist/types/wire/refuel.d.ts.map +1 -1
  248. package/dist/types/wire/withdraw.d.ts.map +1 -1
  249. package/package.json +2 -2
  250. package/src/client/PerpsClient.ts +48 -10
  251. package/src/decimal/arithmetic.ts +144 -0
  252. package/src/decimal/big.ts +0 -5
  253. package/src/decimal/compare.ts +67 -0
  254. package/src/decimal/convert.ts +123 -44
  255. package/src/decimal/decimalStringToBig.ts +47 -0
  256. package/src/decimal/format.ts +81 -68
  257. package/src/decimal/parse.ts +73 -36
  258. package/src/index.ts +76 -8
  259. package/src/math/fills.ts +32 -17
  260. package/src/math/order.ts +261 -216
  261. package/src/math/position.ts +277 -194
  262. package/src/services/getGasRecommendation.ts +1 -1
  263. package/src/services/getQuote.ts +2 -2
  264. package/src/services/resolveSubscribeQuote.ts +4 -3
  265. package/src/transport/request.ts +7 -2
  266. package/src/types/api.ts +10 -0
  267. package/src/types/provider.ts +35 -13
  268. package/src/types/withdrawal.ts +35 -8
  269. package/src/utils/createSafeFunction.ts +20 -0
  270. package/src/utils/timestampToIsoString.ts +31 -0
  271. package/src/utils/warnOnce.ts +44 -0
  272. package/src/version.ts +1 -1
  273. package/src/websocket/PerpsWsClient.ts +25 -2
  274. package/src/websocket/wsLog.ts +31 -0
  275. package/src/wire/orderAmounts.ts +3 -2
  276. package/src/wire/refuel.ts +56 -20
  277. package/src/wire/transferable.ts +3 -3
  278. package/src/wire/withdraw.ts +3 -5
  279. package/dist/cjs/decimal/requireDecimal.d.ts +0 -4
  280. package/dist/cjs/decimal/requireDecimal.d.ts.map +0 -1
  281. package/dist/cjs/decimal/requireDecimal.js +0 -17
  282. package/dist/cjs/decimal/requireDecimal.js.map +0 -1
  283. package/dist/esm/decimal/requireDecimal.d.ts +0 -11
  284. package/dist/esm/decimal/requireDecimal.d.ts.map +0 -1
  285. package/dist/esm/decimal/requireDecimal.js +0 -18
  286. package/dist/esm/decimal/requireDecimal.js.map +0 -1
  287. package/dist/types/decimal/requireDecimal.d.ts +0 -11
  288. package/dist/types/decimal/requireDecimal.d.ts.map +0 -1
  289. package/src/decimal/requireDecimal.ts +0 -21
@@ -1,60 +1,97 @@
1
- import { DECIMAL_PATTERN, type DecimalString } from '@lifi/perps-types'
1
+ import { DECIMAL_PATTERN, PerpsErrorCode } from '@lifi/perps-types'
2
+ import Big from 'big.js'
3
+ import { PerpsError } from '../errors/PerpsError.js'
4
+ import { createSafeFunction } from '../utils/createSafeFunction.js'
5
+ import { decimalStringToBig } from './decimalStringToBig.js'
2
6
 
3
7
  /**
4
- * Parse a string to a float, stripping common formatting artefacts.
8
+ * Read a decimal string as a JS float, for a chart or pixel value only. A
9
+ * float holds about 15 significant digits, so the result can lose precision;
10
+ * never use it for an amount sent to a venue.
5
11
  *
6
- * Handles:
7
- * - Currency prefixes/suffixes ($, USD, etc.)
8
- * - Explicit sign prefixes (+/-)
9
- * - Thousands separators (commas)
10
- * - Percentage suffixes (%)
11
- * - Whitespace
12
- *
13
- * @returns Parsed number; `0` for empty/blank input, `NaN` when a non-empty
14
- * string contains no parseable number
12
+ * @throws {PerpsError} `ValidationError` when `value` is not a decimal string
13
+ * or is too large for a finite float.
14
+ * @public
15
15
  */
16
- function toFloat(value: string): number {
17
- if (!value) {
18
- return 0
19
- }
20
- const cleaned = value.trim().replace(/[$%]/g, '').replace(/,/g, '').trim()
21
- if (!cleaned) {
22
- return 0
16
+ export function decimalStringToNumber(value: string): number {
17
+ const parsed = decimalStringToBig(value).toNumber()
18
+ if (!Number.isFinite(parsed)) {
19
+ throw new PerpsError(
20
+ PerpsErrorCode.ValidationError,
21
+ `'${value}' is too large for a finite number.`
22
+ )
23
23
  }
24
- return parseFloat(cleaned)
24
+ return parsed
25
25
  }
26
26
 
27
- const FORMATTED_NUMBER =
28
- /^(?:[+-]\s*)?(?:\$\s*)?(?:(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:\s*(?:%|USD))?$/i
27
+ /**
28
+ * {@link decimalStringToNumber}, or `undefined` with a warning when it throws.
29
+ *
30
+ * @public
31
+ */
32
+ export const safeDecimalStringToNumber = createSafeFunction(
33
+ 'decimalStringToNumber',
34
+ decimalStringToNumber
35
+ )
29
36
 
30
37
  /**
31
- * Parse an optional decimal field, tolerating currency symbols, grouping
32
- * separators and a percentage suffix around the number.
33
- * Gives back `undefined` for a missing, malformed or non-finite value, and `0` for an empty string.
38
+ * Narrows an unknown value to a {@link DecimalString}. No characters are
39
+ * removed first.
34
40
  *
35
41
  * @public
36
42
  */
37
- export function parseDecimal(
38
- value: DecimalString | string | null | undefined
39
- ): number | undefined {
40
- if (value == null) {
43
+ export function isDecimalString(value: unknown): value is string {
44
+ return typeof value === 'string' && DECIMAL_PATTERN.test(value)
45
+ }
46
+
47
+ const MAX_SPELLED_EXPONENT = 1000
48
+
49
+ function spellDecimal(value: unknown): string | undefined {
50
+ if (isDecimalString(value)) {
51
+ return value
52
+ }
53
+ if (typeof value !== 'string' && typeof value !== 'number') {
54
+ return undefined
55
+ }
56
+ if (typeof value === 'number' && !Number.isFinite(value)) {
41
57
  return undefined
42
58
  }
43
- if (value.trim() === '') {
44
- return toFloat(value)
59
+ let parsed: Big
60
+ try {
61
+ parsed = new Big(value)
62
+ } catch {
63
+ return undefined
45
64
  }
46
- if (!FORMATTED_NUMBER.test(value.trim())) {
65
+ // Spelling out an unbounded exponent builds a string of that many digits.
66
+ if (Math.abs(parsed.e) > MAX_SPELLED_EXPONENT) {
47
67
  return undefined
48
68
  }
49
- const parsed = toFloat(value)
50
- return Number.isFinite(parsed) ? parsed : undefined
69
+ return (parsed.eq(0) ? new Big(0) : parsed).toFixed()
51
70
  }
52
71
 
53
72
  /**
54
- * Narrows an unknown value to a {@link DecimalString}.
73
+ * Read a venue value (a string or a number) as a decimal string, for a
74
+ * money-path value that must not go on wrong. A number or an exponent string
75
+ * is spelled out in full; no `$`, `%` or `,` is removed.
55
76
  *
77
+ * @param tool - Provider key set on the error.
78
+ * @throws {PerpsError} `SDKError` naming `field` when `value` is not a finite
79
+ * decimal.
56
80
  * @public
57
81
  */
58
- export function isDecimalString(value: unknown): value is DecimalString {
59
- return typeof value === 'string' && DECIMAL_PATTERN.test(value)
82
+ export function unknownToDecimalString(
83
+ value: unknown,
84
+ field: string,
85
+ tool: string
86
+ ): string {
87
+ const decimal = spellDecimal(value)
88
+ if (decimal !== undefined) {
89
+ return decimal
90
+ }
91
+ const error = new PerpsError(
92
+ PerpsErrorCode.SDKError,
93
+ `${tool} field \`${field}\` is not a valid decimal: '${String(value)}'`
94
+ )
95
+ error.tool = tool
96
+ throw error
60
97
  }
package/src/index.ts CHANGED
@@ -17,11 +17,39 @@ export {
17
17
  } from './client/createPerpsClient.js'
18
18
  export { PerpsClient } from './client/PerpsClient.js'
19
19
  export { requireProvider } from './client/requireProvider.js'
20
- export type { BaseUnitsRounding } from './decimal/convert.js'
21
20
  export {
22
- baseUnitsToDecimal,
23
- decimalToBaseUnits,
21
+ absDecimalString,
22
+ addDecimalString,
23
+ divideDecimalString,
24
+ divideDecimalStringRoundDown,
25
+ multiplyDecimalString,
26
+ safeAbsDecimalString,
27
+ safeAddDecimalString,
28
+ safeDivideDecimalString,
29
+ safeDivideDecimalStringRoundDown,
30
+ safeMultiplyDecimalString,
31
+ safeSubtractDecimalString,
32
+ subtractDecimalString,
33
+ } from './decimal/arithmetic.js'
34
+ export {
35
+ compareDecimalStrings,
36
+ isDecimalStringGreaterThan,
37
+ isDecimalStringZero,
38
+ safeCompareDecimalStrings,
39
+ safeIsDecimalStringGreaterThan,
40
+ safeIsDecimalStringZero,
41
+ } from './decimal/compare.js'
42
+ export type { DecimalRounding } from './decimal/convert.js'
43
+ export {
44
+ decimalStringToScaledInteger,
24
45
  numberToDecimalString,
46
+ roundDecimalString,
47
+ safeDecimalStringToScaledInteger,
48
+ safeNumberToDecimalString,
49
+ safeRoundDecimalString,
50
+ safeScaledIntegerToDecimalString,
51
+ safeTruncateDecimal,
52
+ scaledIntegerToDecimalString,
25
53
  truncateDecimal,
26
54
  } from './decimal/convert.js'
27
55
  export type { FormatOptions, RoundingMode } from './decimal/format.js'
@@ -33,7 +61,12 @@ export {
33
61
  formatSignedUsd,
34
62
  formatUsd,
35
63
  } from './decimal/format.js'
36
- export { isDecimalString, parseDecimal } from './decimal/parse.js'
64
+ export {
65
+ decimalStringToNumber,
66
+ isDecimalString,
67
+ safeDecimalStringToNumber,
68
+ unknownToDecimalString,
69
+ } from './decimal/parse.js'
37
70
  export { PerpsErrorMessage } from './errors/constants.js'
38
71
  export { PerpsError } from './errors/PerpsError.js'
39
72
  export {
@@ -43,7 +76,7 @@ export {
43
76
  } from './math/fills.js'
44
77
  export type { ExpectedPnl } from './math/order.js'
45
78
  export {
46
- applySlippage,
79
+ applySlippageToPrice,
47
80
  buildQuote,
48
81
  calculateExpectedPnl,
49
82
  calculateRealizedPnlPercent,
@@ -54,6 +87,17 @@ export {
54
87
  estimateRealizedPnl,
55
88
  findMatchingPosition,
56
89
  resolveCloseSize,
90
+ safeApplySlippageToPrice,
91
+ safeBuildQuote,
92
+ safeCalculateExpectedPnl,
93
+ safeCalculateRealizedPnlPercent,
94
+ safeCalculateSize,
95
+ safeCalculateTriggerPercent,
96
+ safeCalculateTriggerPrice,
97
+ safeEstimateFees,
98
+ safeEstimateRealizedPnl,
99
+ safeResolveCloseSize,
100
+ safeWalkOrderbook,
57
101
  walkOrderbook,
58
102
  } from './math/order.js'
59
103
  export {
@@ -66,10 +110,24 @@ export {
66
110
  calculateUnrealizedPnl,
67
111
  estimateAverageEntryPrice,
68
112
  estimateLiquidationPrice,
113
+ estimateLiquidationPriceAtMarketRate,
69
114
  estimateNewLeverage,
70
115
  estimateUnrealizedPnl,
71
116
  positionSupportsMarginAdjustment,
72
117
  positionSupportsMarginRemoval,
118
+ safeCalculateEffectiveLeverage,
119
+ safeCalculateLiquidationDistance,
120
+ safeCalculateNotionalValue,
121
+ safeCalculateRealizedPnl,
122
+ safeCalculateRequiredMargin,
123
+ safeCalculateRoe,
124
+ safeCalculateUnrealizedPnl,
125
+ safeEstimateAverageEntryPrice,
126
+ safeEstimateLiquidationPrice,
127
+ safeEstimateLiquidationPriceAtMarketRate,
128
+ safeEstimateNewLeverage,
129
+ safeEstimateUnrealizedPnl,
130
+ safeWouldImmediatelyLiquidate,
73
131
  wouldImmediatelyLiquidate,
74
132
  } from './math/position.js'
75
133
  // Registries
@@ -172,6 +230,7 @@ export type {
172
230
  GetPortfolioHistoryParams,
173
231
  GetSetupParams,
174
232
  GetWithdrawableBalancesParams,
233
+ GetWithdrawalTypesParams,
175
234
  GetWithdrawFlowParams,
176
235
  ModifyOrdersParams,
177
236
  PerpsClientOptions,
@@ -218,6 +277,7 @@ export type {
218
277
  ProviderGetPositionsParams,
219
278
  ProviderGetQuoteParams,
220
279
  ProviderGetWithdrawableBalancesParams,
280
+ ProviderGetWithdrawalTypesParams,
221
281
  ProviderGetWithdrawFlowParams,
222
282
  QuoteListener,
223
283
  SignActionProgress,
@@ -226,7 +286,8 @@ export type {
226
286
  export type {
227
287
  ProviderWithdrawableBalance,
228
288
  WithdrawableBalance,
229
- WithdrawalRoute,
289
+ WithdrawalSourceTypes,
290
+ WithdrawalTypeOption,
230
291
  WithdrawFlow,
231
292
  WithdrawFlowReady,
232
293
  WithdrawFlowSetupRequired,
@@ -264,7 +325,11 @@ export {
264
325
  signTypedData,
265
326
  signTypedDataWithSigner,
266
327
  } from './utils/signTypedData.js'
267
- export { createWarnOnce } from './utils/warnOnce.js'
328
+ export {
329
+ safeTimestampToIsoString,
330
+ timestampToIsoString,
331
+ } from './utils/timestampToIsoString.js'
332
+ export { createWarnOnce, warnSkippedVenueRow } from './utils/warnOnce.js'
268
333
  // Version
269
334
  export { name, version } from './version.js'
270
335
  export { cachePromise } from './websocket/cachePromise.js'
@@ -296,7 +361,10 @@ export type {
296
361
  } from './wire/orderAmounts.js'
297
362
  export { calculateOrderAmounts } from './wire/orderAmounts.js'
298
363
  export type { RefuelAmountInput } from './wire/refuel.js'
299
- export { calculateRefuelAmount } from './wire/refuel.js'
364
+ export {
365
+ calculateRefuelAmount,
366
+ REFUEL_FEE_MARGIN_PERCENT,
367
+ } from './wire/refuel.js'
300
368
  export { snapOrderPrice, snapOrderSize } from './wire/snap.js'
301
369
  export { calculateTransferable } from './wire/transferable.js'
302
370
  export { calculateWithdrawMax } from './wire/withdraw.js'
package/src/math/fills.ts CHANGED
@@ -3,7 +3,9 @@ import {
3
3
  FillClassification,
4
4
  OrderSide,
5
5
  } from '@lifi/perps-types'
6
- import { parseDecimal } from '../decimal/parse.js'
6
+ import Big from 'big.js'
7
+ import { isDecimalStringZero } from '../decimal/compare.js'
8
+ import { isDecimalString } from '../decimal/parse.js'
7
9
 
8
10
  /**
9
11
  * Re-exported fill taxonomy used by {@link classifyFillFromPosition}.
@@ -18,45 +20,51 @@ export { FillClassification }
18
20
  *
19
21
  * @param startPosition Signed position held BEFORE this fill (`> 0` long,
20
22
  * `< 0` short, `0` flat).
21
- * @param side Hyperliquid-style: `'B'` for buy, anything else for sell.
22
- * @param sz Unsigned fill size, parsed with `parseFloat`.
23
+ * @param sz Unsigned fill size.
24
+ * @returns `BUY` or `SELL` when `startPosition` or `sz` is not a decimal
25
+ * string, so one malformed venue fill still maps.
23
26
  * @public
24
27
  */
25
28
  export function classifyFillFromPosition(
26
29
  startPosition: DecimalString,
27
- side: string,
30
+ side: OrderSide,
28
31
  sz: DecimalString
29
32
  ): FillClassification {
30
- const start = parseFloat(startPosition)
31
- const delta = side === 'B' ? parseFloat(sz) : -parseFloat(sz)
32
- const end = start + delta
33
+ if (!isDecimalString(startPosition) || !isDecimalString(sz)) {
34
+ return side === OrderSide.BUY
35
+ ? FillClassification.BUY
36
+ : FillClassification.SELL
37
+ }
38
+ const start = new Big(startPosition)
39
+ const size = new Big(sz)
40
+ const end = side === OrderSide.BUY ? start.plus(size) : start.minus(size)
33
41
 
34
- if (start === 0) {
35
- return end > 0
42
+ if (start.eq(0)) {
43
+ return end.gt(0)
36
44
  ? FillClassification.OPENED_LONG
37
45
  : FillClassification.OPENED_SHORT
38
46
  }
39
47
 
40
- if (start > 0) {
41
- if (end === 0) {
48
+ if (start.gt(0)) {
49
+ if (end.eq(0)) {
42
50
  return FillClassification.CLOSED_LONG
43
51
  }
44
- if (end < 0) {
52
+ if (end.lt(0)) {
45
53
  return FillClassification.SWITCHED_SHORT
46
54
  }
47
- if (end > start) {
55
+ if (end.gt(start)) {
48
56
  return FillClassification.INCREASED_LONG
49
57
  }
50
58
  return FillClassification.REDUCED_LONG
51
59
  }
52
60
 
53
- if (end === 0) {
61
+ if (end.eq(0)) {
54
62
  return FillClassification.CLOSED_SHORT
55
63
  }
56
- if (end > 0) {
64
+ if (end.gt(0)) {
57
65
  return FillClassification.SWITCHED_LONG
58
66
  }
59
- if (end < start) {
67
+ if (end.lt(start)) {
60
68
  return FillClassification.INCREASED_SHORT
61
69
  }
62
70
  return FillClassification.REDUCED_SHORT
@@ -66,13 +74,20 @@ export function classifyFillFromPosition(
66
74
  * Classify a fill as open or close based on realizedPnl.
67
75
  * @deprecated Use `Fill.classification` instead — it uses startPosition
68
76
  * for accurate open/increase/reduce/close/reverse classification.
77
+ * @returns `BUY` or `SELL` when `realizedPnl` is a string that is not a
78
+ * decimal string.
69
79
  * @public
70
80
  */
71
81
  export function classifyFill(
72
82
  side: OrderSide,
73
83
  realizedPnl: DecimalString | null | undefined
74
84
  ): FillClassification {
75
- const isClose = realizedPnl != null && parseDecimal(realizedPnl) !== 0
85
+ if (realizedPnl != null && !isDecimalString(realizedPnl)) {
86
+ return side === OrderSide.BUY
87
+ ? FillClassification.BUY
88
+ : FillClassification.SELL
89
+ }
90
+ const isClose = realizedPnl != null && !isDecimalStringZero(realizedPnl)
76
91
  if (side === OrderSide.BUY) {
77
92
  return isClose
78
93
  ? FillClassification.CLOSED_SHORT