@lifi/perps-sdk 23.1.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 +6 -2
  15. package/dist/cjs/decimal/compare.d.ts.map +1 -1
  16. package/dist/cjs/decimal/compare.js +15 -2
  17. package/dist/cjs/decimal/compare.js.map +1 -1
  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 -52
  28. package/dist/cjs/decimal/format.js.map +1 -1
  29. package/dist/cjs/decimal/parse.d.ts +4 -4
  30. package/dist/cjs/decimal/parse.d.ts.map +1 -1
  31. package/dist/cjs/decimal/parse.js +42 -25
  32. package/dist/cjs/decimal/parse.js.map +1 -1
  33. package/dist/cjs/index.d.ts +13 -11
  34. package/dist/cjs/index.d.ts.map +1 -1
  35. package/dist/cjs/index.js +64 -8
  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 +39 -5
  112. package/dist/esm/decimal/compare.d.ts.map +1 -1
  113. package/dist/esm/decimal/compare.js +45 -5
  114. package/dist/esm/decimal/compare.js.map +1 -1
  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 -70
  126. package/dist/esm/decimal/format.js.map +1 -1
  127. package/dist/esm/decimal/parse.d.ts +22 -13
  128. package/dist/esm/decimal/parse.d.ts.map +1 -1
  129. package/dist/esm/decimal/parse.js +56 -46
  130. package/dist/esm/decimal/parse.js.map +1 -1
  131. package/dist/esm/index.d.ts +13 -11
  132. package/dist/esm/index.d.ts.map +1 -1
  133. package/dist/esm/index.js +9 -7
  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 +39 -5
  206. package/dist/types/decimal/compare.d.ts.map +1 -1
  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 +22 -13
  214. package/dist/types/decimal/parse.d.ts.map +1 -1
  215. package/dist/types/index.d.ts +13 -11
  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 +60 -10
  254. package/src/decimal/convert.ts +123 -44
  255. package/src/decimal/decimalStringToBig.ts +47 -0
  256. package/src/decimal/format.ts +81 -72
  257. package/src/decimal/parse.ts +71 -61
  258. package/src/index.ts +73 -10
  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 -12
  282. package/dist/cjs/decimal/requireDecimal.js.map +0 -1
  283. package/dist/esm/decimal/requireDecimal.d.ts +0 -5
  284. package/dist/esm/decimal/requireDecimal.d.ts.map +0 -1
  285. package/dist/esm/decimal/requireDecimal.js +0 -7
  286. package/dist/esm/decimal/requireDecimal.js.map +0 -1
  287. package/dist/types/decimal/requireDecimal.d.ts +0 -5
  288. package/dist/types/decimal/requireDecimal.d.ts.map +0 -1
  289. package/src/decimal/requireDecimal.ts +0 -8
@@ -1,87 +1,97 @@
1
- import {
2
- DECIMAL_PATTERN,
3
- type DecimalString,
4
- PerpsErrorCode,
5
- } from '@lifi/perps-types'
1
+ import { DECIMAL_PATTERN, PerpsErrorCode } from '@lifi/perps-types'
2
+ import Big from 'big.js'
6
3
  import { PerpsError } from '../errors/PerpsError.js'
4
+ import { createSafeFunction } from '../utils/createSafeFunction.js'
5
+ import { decimalStringToBig } from './decimalStringToBig.js'
7
6
 
8
7
  /**
9
- * 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.
10
11
  *
11
- * Handles:
12
- * - Currency prefixes/suffixes ($, USD, etc.)
13
- * - Explicit sign prefixes (+/-)
14
- * - Thousands separators (commas)
15
- * - Percentage suffixes (%)
16
- * - Whitespace
17
- *
18
- * @returns Parsed number; `0` for empty/blank input, `NaN` when a non-empty
19
- * 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
20
15
  */
21
- function toFloat(value: string): number {
22
- if (!value) {
23
- return 0
24
- }
25
- const cleaned = value.trim().replace(/[$%]/g, '').replace(/,/g, '').trim()
26
- if (!cleaned) {
27
- 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
+ )
28
23
  }
29
- return parseFloat(cleaned)
24
+ return parsed
30
25
  }
31
26
 
32
- const FORMATTED_NUMBER =
33
- /^(?:[+-]\s*)?(?:\$\s*)?(?:(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:\s*(?:%|USD))?$/i
34
-
35
27
  /**
36
- * Parse an optional decimal field, tolerating currency symbols, grouping
37
- * separators and a percentage suffix around the number.
38
- * Gives back `undefined` for a missing, malformed or non-finite value, and `0` for an empty string.
28
+ * {@link decimalStringToNumber}, or `undefined` with a warning when it throws.
39
29
  *
40
30
  * @public
41
31
  */
42
- export function parseDecimal(
43
- value: DecimalString | string | null | undefined
44
- ): number | undefined {
45
- if (value == null) {
46
- return undefined
47
- }
48
- if (value.trim() === '') {
49
- return toFloat(value)
50
- }
51
- if (!FORMATTED_NUMBER.test(value.trim())) {
52
- return undefined
53
- }
54
- const parsed = toFloat(value)
55
- return Number.isFinite(parsed) ? parsed : undefined
56
- }
32
+ export const safeDecimalStringToNumber = createSafeFunction(
33
+ 'decimalStringToNumber',
34
+ decimalStringToNumber
35
+ )
57
36
 
58
37
  /**
59
- * Narrows an unknown value to a {@link DecimalString}.
38
+ * Narrows an unknown value to a {@link DecimalString}. No characters are
39
+ * removed first.
60
40
  *
61
41
  * @public
62
42
  */
63
- export function isDecimalString(value: unknown): value is DecimalString {
43
+ export function isDecimalString(value: unknown): value is string {
64
44
  return typeof value === 'string' && DECIMAL_PATTERN.test(value)
65
45
  }
66
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)) {
57
+ return undefined
58
+ }
59
+ let parsed: Big
60
+ try {
61
+ parsed = new Big(value)
62
+ } catch {
63
+ return undefined
64
+ }
65
+ // Spelling out an unbounded exponent builds a string of that many digits.
66
+ if (Math.abs(parsed.e) > MAX_SPELLED_EXPONENT) {
67
+ return undefined
68
+ }
69
+ return (parsed.eq(0) ? new Big(0) : parsed).toFixed()
70
+ }
71
+
67
72
  /**
68
- * Check a decimal input against the {@link DecimalString} contract, naming
69
- * the field it came from, so a malformed amount fails at the SDK boundary
70
- * instead of inside big.js.
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.
71
76
  *
72
- * @returns `value`, unchanged.
73
- * @throws {PerpsError} `ValidationError` naming `field`.
77
+ * @param tool - Provider key set on the error.
78
+ * @throws {PerpsError} `SDKError` naming `field` when `value` is not a finite
79
+ * decimal.
74
80
  * @public
75
81
  */
76
- export function validateDecimalString(
77
- value: DecimalString,
78
- field: string
79
- ): DecimalString {
80
- if (!isDecimalString(value)) {
81
- throw new PerpsError(
82
- PerpsErrorCode.ValidationError,
83
- `Invalid \`${field}\`: '${value}' is not a decimal string.`
84
- )
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
85
90
  }
86
- return value
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
87
97
  }
package/src/index.ts CHANGED
@@ -17,12 +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 { isDecimalStringGreaterThan } from './decimal/compare.js'
21
- export type { BaseUnitsRounding } from './decimal/convert.js'
22
20
  export {
23
- baseUnitsToDecimal,
24
- 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,
25
45
  numberToDecimalString,
46
+ roundDecimalString,
47
+ safeDecimalStringToScaledInteger,
48
+ safeNumberToDecimalString,
49
+ safeRoundDecimalString,
50
+ safeScaledIntegerToDecimalString,
51
+ safeTruncateDecimal,
52
+ scaledIntegerToDecimalString,
26
53
  truncateDecimal,
27
54
  } from './decimal/convert.js'
28
55
  export type { FormatOptions, RoundingMode } from './decimal/format.js'
@@ -35,9 +62,10 @@ export {
35
62
  formatUsd,
36
63
  } from './decimal/format.js'
37
64
  export {
65
+ decimalStringToNumber,
38
66
  isDecimalString,
39
- parseDecimal,
40
- validateDecimalString,
67
+ safeDecimalStringToNumber,
68
+ unknownToDecimalString,
41
69
  } from './decimal/parse.js'
42
70
  export { PerpsErrorMessage } from './errors/constants.js'
43
71
  export { PerpsError } from './errors/PerpsError.js'
@@ -48,7 +76,7 @@ export {
48
76
  } from './math/fills.js'
49
77
  export type { ExpectedPnl } from './math/order.js'
50
78
  export {
51
- applySlippage,
79
+ applySlippageToPrice,
52
80
  buildQuote,
53
81
  calculateExpectedPnl,
54
82
  calculateRealizedPnlPercent,
@@ -59,6 +87,17 @@ export {
59
87
  estimateRealizedPnl,
60
88
  findMatchingPosition,
61
89
  resolveCloseSize,
90
+ safeApplySlippageToPrice,
91
+ safeBuildQuote,
92
+ safeCalculateExpectedPnl,
93
+ safeCalculateRealizedPnlPercent,
94
+ safeCalculateSize,
95
+ safeCalculateTriggerPercent,
96
+ safeCalculateTriggerPrice,
97
+ safeEstimateFees,
98
+ safeEstimateRealizedPnl,
99
+ safeResolveCloseSize,
100
+ safeWalkOrderbook,
62
101
  walkOrderbook,
63
102
  } from './math/order.js'
64
103
  export {
@@ -71,10 +110,24 @@ export {
71
110
  calculateUnrealizedPnl,
72
111
  estimateAverageEntryPrice,
73
112
  estimateLiquidationPrice,
113
+ estimateLiquidationPriceAtMarketRate,
74
114
  estimateNewLeverage,
75
115
  estimateUnrealizedPnl,
76
116
  positionSupportsMarginAdjustment,
77
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,
78
131
  wouldImmediatelyLiquidate,
79
132
  } from './math/position.js'
80
133
  // Registries
@@ -177,6 +230,7 @@ export type {
177
230
  GetPortfolioHistoryParams,
178
231
  GetSetupParams,
179
232
  GetWithdrawableBalancesParams,
233
+ GetWithdrawalTypesParams,
180
234
  GetWithdrawFlowParams,
181
235
  ModifyOrdersParams,
182
236
  PerpsClientOptions,
@@ -223,6 +277,7 @@ export type {
223
277
  ProviderGetPositionsParams,
224
278
  ProviderGetQuoteParams,
225
279
  ProviderGetWithdrawableBalancesParams,
280
+ ProviderGetWithdrawalTypesParams,
226
281
  ProviderGetWithdrawFlowParams,
227
282
  QuoteListener,
228
283
  SignActionProgress,
@@ -231,7 +286,8 @@ export type {
231
286
  export type {
232
287
  ProviderWithdrawableBalance,
233
288
  WithdrawableBalance,
234
- WithdrawalRoute,
289
+ WithdrawalSourceTypes,
290
+ WithdrawalTypeOption,
235
291
  WithdrawFlow,
236
292
  WithdrawFlowReady,
237
293
  WithdrawFlowSetupRequired,
@@ -269,7 +325,11 @@ export {
269
325
  signTypedData,
270
326
  signTypedDataWithSigner,
271
327
  } from './utils/signTypedData.js'
272
- 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'
273
333
  // Version
274
334
  export { name, version } from './version.js'
275
335
  export { cachePromise } from './websocket/cachePromise.js'
@@ -301,7 +361,10 @@ export type {
301
361
  } from './wire/orderAmounts.js'
302
362
  export { calculateOrderAmounts } from './wire/orderAmounts.js'
303
363
  export type { RefuelAmountInput } from './wire/refuel.js'
304
- export { calculateRefuelAmount } from './wire/refuel.js'
364
+ export {
365
+ calculateRefuelAmount,
366
+ REFUEL_FEE_MARGIN_PERCENT,
367
+ } from './wire/refuel.js'
305
368
  export { snapOrderPrice, snapOrderSize } from './wire/snap.js'
306
369
  export { calculateTransferable } from './wire/transferable.js'
307
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