@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
@@ -2,53 +2,92 @@ import { PerpsErrorCode } from '@lifi/perps-types';
2
2
  import Big from 'big.js';
3
3
  import { formatUnits } from 'viem';
4
4
  import { PerpsError } from '../errors/PerpsError.js';
5
- import { requireDecimal } from './requireDecimal.js';
5
+ import { createSafeFunction } from '../utils/createSafeFunction.js';
6
+ import { bigToDecimalString, decimalStringToBig } from './decimalStringToBig.js';
7
+ import { isDecimalString } from './parse.js';
8
+ const BIG_ROUNDING = {
9
+ truncate: Big.roundDown,
10
+ round: Big.roundHalfUp,
11
+ up: Big.roundUp,
12
+ };
6
13
  /**
7
- * Scale a decimal string to a scaled integer in exact decimal arithmetic — an
8
- * on-grid input maps to its exact scaled integer with no binary float
9
- * artifacts (`'0.29'` at 2 decimals is 29, never 28). Off-grid input resolves
10
- * per `rounding`; there is no silent default.
14
+ * Round a decimal string to `decimals` places with exact decimal arithmetic.
15
+ * The result has no trailing zeros: `roundDecimalString('1.50', 1, 'round')`
16
+ * is `'1.5'`.
11
17
  *
12
- * @throws {PerpsError} `ValidationError` when `value` is not a
13
- * {@link DecimalString}, `decimals` is not a non-negative integer, or the scaled
14
- * result's magnitude exceeds `Number.MAX_SAFE_INTEGER`.
18
+ * @throws {PerpsError} `ValidationError` when `value` is not a decimal string,
19
+ * or `decimals` is not a non-negative integer.
20
+ * @public
21
+ */
22
+ export function roundDecimalString(value, decimals, rounding) {
23
+ if (!Number.isInteger(decimals) || decimals < 0) {
24
+ throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid decimals for rounding: ${decimals}`);
25
+ }
26
+ return bigToDecimalString(decimalStringToBig(value).round(decimals, BIG_ROUNDING[rounding]));
27
+ }
28
+ /**
29
+ * {@link roundDecimalString}, or `undefined` with a warning when it throws.
30
+ *
31
+ * @public
32
+ */
33
+ export const safeRoundDecimalString = createSafeFunction('roundDecimalString', roundDecimalString);
34
+ /**
35
+ * Scale a decimal string to an integer at `decimals` places in exact decimal
36
+ * arithmetic: `'0.29'` at 2 decimals is 29, never 28. Off-grid input resolves
37
+ * per `rounding`. No `$`, `%` or `,` is removed first.
38
+ *
39
+ * @throws {PerpsError} `ValidationError` when `value` is not a decimal string,
40
+ * `decimals` is not a non-negative integer, or the result's magnitude
41
+ * exceeds `Number.MAX_SAFE_INTEGER`.
15
42
  * @public
16
43
  */
17
- export const decimalToBaseUnits = (value, decimals, rounding) => {
44
+ export function decimalStringToScaledInteger(value, decimals, rounding) {
45
+ if (!isDecimalString(value)) {
46
+ throw new PerpsError(PerpsErrorCode.ValidationError, `'${value}' is not a decimal string.`);
47
+ }
18
48
  if (!Number.isInteger(decimals) || decimals < 0) {
19
49
  throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid decimals for integer scaling: ${decimals}`);
20
50
  }
21
- const scaled = requireDecimal(value, 'decimalToBaseUnits(value)')
51
+ const scaled = new Big(value)
22
52
  .times(new Big(10).pow(decimals))
23
- .round(0, rounding === 'truncate' ? Big.roundDown : Big.roundHalfUp);
53
+ .round(0, BIG_ROUNDING[rounding]);
24
54
  if (scaled.abs().gt(Number.MAX_SAFE_INTEGER)) {
25
55
  throw new PerpsError(PerpsErrorCode.ValidationError, `Scaled value ${scaled.toFixed()} exceeds Number.MAX_SAFE_INTEGER and cannot be encoded exactly.`);
26
56
  }
27
57
  return scaled.toNumber();
28
- };
29
- const BASE_UNITS_PATTERN = /^-?\d+$/;
58
+ }
30
59
  /**
31
- * Convert a base-unit amount (integer string) to a decimal string.
60
+ * {@link decimalStringToScaledInteger}, or `undefined` with a warning when it
61
+ * throws.
62
+ *
63
+ * @public
64
+ */
65
+ export const safeDecimalStringToScaledInteger = createSafeFunction('decimalStringToScaledInteger', decimalStringToScaledInteger);
66
+ export const BASE_UNITS_PATTERN = /^-?\d+$/;
67
+ /**
68
+ * Convert a scaled integer string (a token amount in base units) to a decimal
69
+ * string: `scaledIntegerToDecimalString('1000000', 6)` is `'1'`.
32
70
  *
33
- * @param amount - Amount in base units (e.g. "1000000" for 1 USDC)
34
- * @param decimals - Token decimals (e.g. 6 for USDC)
35
71
  * @throws {PerpsError} `ValidationError` when `amount` is not an integer
36
72
  * string, or `decimals` is not a non-negative integer.
37
- * @example
38
- * ```ts
39
- * baseUnitsToDecimal('1000000', 6) // '1'
40
- * ```
41
73
  * @public
42
74
  */
43
- export function baseUnitsToDecimal(amount, decimals) {
75
+ export function scaledIntegerToDecimalString(amount, decimals) {
44
76
  if (!Number.isInteger(decimals) || decimals < 0) {
45
- throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`baseUnitsToDecimal(decimals)\`: ${decimals} is not a non-negative integer.`);
77
+ throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`scaledIntegerToDecimalString(decimals)\`: ${decimals} is not a non-negative integer.`);
46
78
  }
47
79
  if (!BASE_UNITS_PATTERN.test(amount)) {
48
- throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`baseUnitsToDecimal(amount)\`: '${amount}' is not an integer base-unit string.`);
80
+ throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid \`scaledIntegerToDecimalString(amount)\`: '${amount}' is not an integer base-unit string.`);
49
81
  }
50
82
  return formatUnits(BigInt(amount), decimals);
51
83
  }
84
+ /**
85
+ * {@link scaledIntegerToDecimalString}, or `undefined` with a warning when it
86
+ * throws.
87
+ *
88
+ * @public
89
+ */
90
+ export const safeScaledIntegerToDecimalString = createSafeFunction('scaledIntegerToDecimalString', scaledIntegerToDecimalString);
52
91
  /**
53
92
  * Round `value` down to `decimals` and pad the result to exactly that many
54
93
  * decimal places. The padding is the point: this seeds a fixed-decimal input,
@@ -61,17 +100,23 @@ export function baseUnitsToDecimal(amount, decimals) {
61
100
  * `'0.010000000000000000'`, which `Number#toFixed` cannot.
62
101
  *
63
102
  * @throws {PerpsError} `ValidationError` when `value` is not a
64
- * {@link DecimalString}, or `decimals` is not a non-negative integer.
103
+ * decimal string, or `decimals` is not a non-negative integer.
65
104
  * @public
66
105
  */
67
106
  export function truncateDecimal(value, decimals) {
68
107
  if (!Number.isInteger(decimals) || decimals < 0) {
69
108
  throw new PerpsError(PerpsErrorCode.ValidationError, `Invalid decimals for truncation: ${decimals}`);
70
109
  }
71
- const truncated = requireDecimal(value, 'truncateDecimal(value)').round(decimals, Big.roundDown);
110
+ const truncated = decimalStringToBig(value).round(decimals, Big.roundDown);
72
111
  // big.js carries the sign through a round to zero; '-0.00' is not a spelling.
73
112
  return (truncated.eq(0) ? new Big(0) : truncated).toFixed(decimals);
74
113
  }
114
+ /**
115
+ * {@link truncateDecimal}, or `undefined` with a warning when it throws.
116
+ *
117
+ * @public
118
+ */
119
+ export const safeTruncateDecimal = createSafeFunction('truncateDecimal', truncateDecimal);
75
120
  /**
76
121
  * Spell a `number` as a {@link DecimalString} in plain notation: `1e-7`
77
122
  * becomes `'0.0000001'`, never `'1e-7'`. The boundary helper for a venue or
@@ -89,4 +134,10 @@ export function numberToDecimalString(value) {
89
134
  const parsed = new Big(value);
90
135
  return (parsed.eq(0) ? new Big(0) : parsed).toFixed();
91
136
  }
137
+ /**
138
+ * {@link numberToDecimalString}, or `undefined` with a warning when it throws.
139
+ *
140
+ * @public
141
+ */
142
+ export const safeNumberToDecimalString = createSafeFunction('numberToDecimalString', numberToDecimalString);
92
143
  //# sourceMappingURL=convert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/decimal/convert.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/decimal/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAY5C,MAAM,YAAY,GAAG;IACnB,QAAQ,EAAE,GAAG,CAAC,SAAS;IACvB,KAAK,EAAE,GAAG,CAAC,WAAW;IACtB,EAAE,EAAE,GAAG,CAAC,OAAO;CACP,CAAA;AAEV;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,QAAgB,EAChB,QAAyB;IAEzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,kCAAkC,QAAQ,EAAE,CAC7C,CAAA;IACH,CAAC;IACD,OAAO,kBAAkB,CACvB,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAClE,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,kBAAkB,CACtD,oBAAoB,EACpB,kBAAkB,CACnB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAa,EACb,QAAgB,EAChB,QAAyB;IAEzB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,IAAI,KAAK,4BAA4B,CACtC,CAAA;IACH,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,yCAAyC,QAAQ,EAAE,CACpD,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC;SAC1B,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;SAChC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;IACnC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,gBAAgB,MAAM,CAAC,OAAO,EAAE,iEAAiE,CAClG,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,kBAAkB,CAChE,8BAA8B,EAC9B,4BAA4B,CAC7B,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,SAAS,CAAA;AAE3C;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,MAAc,EACd,QAAgB;IAEhB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,uDAAuD,QAAQ,iCAAiC,CACjG,CAAA;IACH,CAAC;IACD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,sDAAsD,MAAM,uCAAuC,CACpG,CAAA;IACH,CAAC;IACD,OAAO,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,kBAAkB,CAChE,8BAA8B,EAC9B,4BAA4B,CAC7B,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAgB;IAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,oCAAoC,QAAQ,EAAE,CAC/C,CAAA;IACH,CAAC;IACD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAC1E,8EAA8E;IAC9E,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,kBAAkB,CACnD,iBAAiB,EACjB,eAAe,CAChB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,0CAA0C,KAAK,EAAE,CAClD,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,kBAAkB,CACzD,uBAAuB,EACvB,qBAAqB,CACtB,CAAA"}
@@ -0,0 +1,26 @@
1
+ import Big from 'big.js';
2
+ /**
3
+ * Read a decimal string as a `Big`. Whitespace, `$`, `%` and `,` are removed
4
+ * first, so `'$1,234.5'` reads as `1234.5`; the rest must match
5
+ * `DECIMAL_PATTERN`, so an exponent form such as `'1e5'` is rejected.
6
+ *
7
+ * @throws {PerpsError} `ValidationError` when `value` is not a string or the
8
+ * cleaned string is not a decimal string.
9
+ * @internal
10
+ */
11
+ export declare function decimalStringToBig(value: string): Big;
12
+ /**
13
+ * Spell a `Big` as a canonical decimal string, with no exponent and no `-0`.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare function bigToDecimalString(value: Big): string;
18
+ /**
19
+ * {@link decimalStringToBig} as a `DivBig`, so a later `div` keeps 40 decimal
20
+ * places.
21
+ *
22
+ * @throws {PerpsError} `ValidationError` as {@link decimalStringToBig}.
23
+ * @internal
24
+ */
25
+ export declare function decimalStringToDivBig(value: string): Big;
26
+ //# sourceMappingURL=decimalStringToBig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimalStringToBig.d.ts","sourceRoot":"","sources":["../../../src/decimal/decimalStringToBig.ts"],"names":[],"mappings":"AACA,OAAO,GAAG,MAAM,QAAQ,CAAA;AAMxB;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAUrD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAExD"}
@@ -0,0 +1,40 @@
1
+ import { DECIMAL_PATTERN, PerpsErrorCode } from '@lifi/perps-types';
2
+ import Big from 'big.js';
3
+ import { PerpsError } from '../errors/PerpsError.js';
4
+ import { DivBig } from './big.js';
5
+ const DISPLAY_CHARACTERS = /[\s$%,]/g;
6
+ /**
7
+ * Read a decimal string as a `Big`. Whitespace, `$`, `%` and `,` are removed
8
+ * first, so `'$1,234.5'` reads as `1234.5`; the rest must match
9
+ * `DECIMAL_PATTERN`, so an exponent form such as `'1e5'` is rejected.
10
+ *
11
+ * @throws {PerpsError} `ValidationError` when `value` is not a string or the
12
+ * cleaned string is not a decimal string.
13
+ * @internal
14
+ */
15
+ export function decimalStringToBig(value) {
16
+ const cleaned = typeof value === 'string' ? value.replace(DISPLAY_CHARACTERS, '') : '';
17
+ if (!DECIMAL_PATTERN.test(cleaned)) {
18
+ throw new PerpsError(PerpsErrorCode.ValidationError, `'${String(value)}' is not a decimal string.`);
19
+ }
20
+ return new Big(cleaned);
21
+ }
22
+ /**
23
+ * Spell a `Big` as a canonical decimal string, with no exponent and no `-0`.
24
+ *
25
+ * @internal
26
+ */
27
+ export function bigToDecimalString(value) {
28
+ return value.eq(0) ? '0' : value.toFixed();
29
+ }
30
+ /**
31
+ * {@link decimalStringToBig} as a `DivBig`, so a later `div` keeps 40 decimal
32
+ * places.
33
+ *
34
+ * @throws {PerpsError} `ValidationError` as {@link decimalStringToBig}.
35
+ * @internal
36
+ */
37
+ export function decimalStringToDivBig(value) {
38
+ return new DivBig(decimalStringToBig(value));
39
+ }
40
+ //# sourceMappingURL=decimalStringToBig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimalStringToBig.js","sourceRoot":"","sources":["../../../src/decimal/decimalStringToBig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACnE,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,kBAAkB,GAAG,UAAU,CAAA;AAErC;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,MAAM,OAAO,GACX,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACxE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,UAAU,CAClB,cAAc,CAAC,eAAe,EAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAC9C,CAAA;IACH,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAU;IAC3C,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,IAAI,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;AAC9C,CAAC"}
@@ -7,7 +7,10 @@ import type { DecimalString } from '@lifi/perps-types';
7
7
  export interface FormatOptions {
8
8
  /** Fixed number of decimal places. Defaults are per-formatter. */
9
9
  decimals?: number;
10
- /** Rendered when the value is null/undefined/NaN/non-finite. Defaults to `'—'`. */
10
+ /**
11
+ * Rendered when the value is null, undefined, blank or a non-finite number.
12
+ * A string that is not a decimal is shown unchanged. Defaults to `'—'`.
13
+ */
11
14
  placeholder?: string;
12
15
  /** BCP 47 locale controlling digit grouping and separators (e.g. `'en-US'`). */
13
16
  locale?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/decimal/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEtD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAA;AAI7C,KAAK,WAAW,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AA6FrE;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAaR;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAaR;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAaR;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAaR;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAqBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAkBR"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../src/decimal/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAA;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAA;AAI7C,KAAK,WAAW,GAAG,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;AA+ErE;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgBR;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAgBR;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAwBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAqBR"}
@@ -1,66 +1,49 @@
1
+ import Big from 'big.js';
2
+ import { decimalStringToBig } from './decimalStringToBig.js';
1
3
  const DEFAULT_PLACEHOLDER = '—';
2
4
  /**
3
- * Extra decimal places used to normalise IEEE-754 representation noise before
4
- * truncating. `toFixed` at this higher precision cleans values like
5
- * `0.28999999…` back to `0.29`; truncation then chops the guard digits.
5
+ * Read a display input as a `Big`: `$`, `%`, `,` and whitespace are removed
6
+ * from a string first. `null` means the formatter renders the placeholder;
7
+ * a string it cannot read is returned unchanged for display.
6
8
  */
7
- const FLOAT_GUARD_DIGITS = 9;
8
- /**
9
- * Tolerantly coerce a display input to a finite number.
10
- *
11
- * Strips `$`, `,`, and surrounding whitespace from strings. Returns `null`
12
- * when the value is null/undefined/blank or does not resolve to a finite
13
- * number, so callers can render a placeholder instead of `$0.00` or `$NaN`.
14
- */
15
- function toFiniteNumber(value) {
16
- let n;
17
- if (typeof value === 'string') {
18
- const cleaned = value.replace(/[$,\s]/g, '');
19
- if (!cleaned) {
20
- return null;
21
- }
22
- n = Number(cleaned);
23
- }
24
- else if (typeof value === 'number') {
25
- n = value;
26
- }
27
- else {
9
+ function toBig(value) {
10
+ if (typeof value === 'number') {
11
+ return Number.isFinite(value) ? new Big(value) : null;
12
+ }
13
+ if (typeof value !== 'string' || value.trim() === '') {
28
14
  return null;
29
15
  }
30
- return Number.isFinite(n) ? n : null;
16
+ try {
17
+ return decimalStringToBig(value);
18
+ }
19
+ catch {
20
+ return value;
21
+ }
31
22
  }
32
- /**
33
- * Truncate a non-negative value toward zero to `decimals` places using its
34
- * decimal string, never float scaling. Representation noise is first
35
- * normalised by `toFixed` at {@link FLOAT_GUARD_DIGITS} extra precision, then
36
- * the guard digits are chopped: `99.999` at 2dp → `99.99`, `0.29` → `0.29`.
37
- */
38
- function truncateAbs(abs, decimals) {
39
- // `toFixed` emits exponent notation at >= 1e21; every double that large is an integer.
40
- if (Number.isInteger(abs)) {
41
- return abs;
42
- }
43
- const s = abs.toFixed(Math.min(decimals + FLOAT_GUARD_DIGITS, 100));
44
- const dot = s.indexOf('.');
45
- const cut = decimals === 0 ? dot : dot + 1 + decimals;
46
- return Number(s.slice(0, cut));
23
+ function decimalSeparator(locale) {
24
+ return (new Intl.NumberFormat(locale)
25
+ .formatToParts(1.5)
26
+ .find((part) => part.type === 'decimal')?.value ?? '.');
47
27
  }
48
28
  /**
49
- * Reduce `n` to `decimals` places then split into a sign and the
29
+ * Reduce `value` to `decimals` places then split into a sign and the
50
30
  * locale-formatted absolute body. The sign is derived from the reduced value
51
31
  * so magnitudes that collapse to zero render without a spurious `-`/`+`.
52
32
  * `signed` emits `+` for positives; `rounding` selects half-up or truncation.
53
33
  */
54
- function signAndBody(n, decimals, locale, grouping, rounding, signed) {
55
- const reduced = rounding === 'floor'
56
- ? (n < 0 ? -1 : 1) * truncateAbs(Math.abs(n), decimals)
57
- : Number(n.toFixed(decimals));
58
- const sign = reduced < 0 ? '-' : signed && reduced > 0 ? '+' : '';
59
- const body = Math.abs(reduced).toLocaleString(locale, {
60
- minimumFractionDigits: decimals,
61
- maximumFractionDigits: decimals,
62
- useGrouping: grouping,
63
- });
34
+ function signAndBody(value, decimals, locale, grouping, rounding, signed) {
35
+ const reduced = value.round(decimals, rounding === 'floor' ? Big.roundDown : Big.roundHalfUp);
36
+ const sign = reduced.lt(0) ? '-' : signed && reduced.gt(0) ? '+' : '';
37
+ const [integerPart = '0', fractionPart] = reduced
38
+ .abs()
39
+ .toFixed(decimals)
40
+ .split('.');
41
+ const integerBody = grouping
42
+ ? BigInt(integerPart).toLocaleString(locale)
43
+ : integerPart;
44
+ const body = fractionPart === undefined
45
+ ? integerBody
46
+ : `${integerBody}${decimalSeparator(locale)}${fractionPart}`;
64
47
  return { sign, body };
65
48
  }
66
49
  /**
@@ -68,13 +51,13 @@ function signAndBody(n, decimals, locale, grouping, rounding, signed) {
68
51
  * `>=1` → 2, `>=0.1` → 4, `>=0.01` → 5, otherwise 6.
69
52
  */
70
53
  function autoDecimals(abs) {
71
- if (abs >= 1) {
54
+ if (abs.gte(1)) {
72
55
  return 2;
73
56
  }
74
- if (abs >= 0.1) {
57
+ if (abs.gte('0.1')) {
75
58
  return 4;
76
59
  }
77
- if (abs >= 0.01) {
60
+ if (abs.gte('0.01')) {
78
61
  return 5;
79
62
  }
80
63
  return 6;
@@ -93,10 +76,13 @@ function autoDecimals(abs) {
93
76
  */
94
77
  export function formatNumber(value, options = {}) {
95
78
  const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
96
- const n = toFiniteNumber(value);
79
+ const n = toBig(value);
97
80
  if (n === null) {
98
81
  return placeholder;
99
82
  }
83
+ if (typeof n === 'string') {
84
+ return n;
85
+ }
100
86
  const { sign, body } = signAndBody(n, decimals, locale, true, rounding, false);
101
87
  return `${sign}${body}`;
102
88
  }
@@ -110,10 +96,13 @@ export function formatNumber(value, options = {}) {
110
96
  */
111
97
  export function formatUsd(value, options = {}) {
112
98
  const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
113
- const n = toFiniteNumber(value);
99
+ const n = toBig(value);
114
100
  if (n === null) {
115
101
  return placeholder;
116
102
  }
103
+ if (typeof n === 'string') {
104
+ return n;
105
+ }
117
106
  const { sign, body } = signAndBody(n, decimals, locale, true, rounding, false);
118
107
  return `${sign}$${body}`;
119
108
  }
@@ -128,10 +117,13 @@ export function formatUsd(value, options = {}) {
128
117
  */
129
118
  export function formatSignedUsd(value, options = {}) {
130
119
  const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
131
- const n = toFiniteNumber(value);
120
+ const n = toBig(value);
132
121
  if (n === null) {
133
122
  return placeholder;
134
123
  }
124
+ if (typeof n === 'string') {
125
+ return n;
126
+ }
135
127
  const { sign, body } = signAndBody(n, decimals, locale, true, rounding, true);
136
128
  return `${sign}$${body}`;
137
129
  }
@@ -146,10 +138,13 @@ export function formatSignedUsd(value, options = {}) {
146
138
  */
147
139
  export function formatSignedPercent(value, options = {}) {
148
140
  const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
149
- const n = toFiniteNumber(value);
141
+ const n = toBig(value);
150
142
  if (n === null) {
151
143
  return placeholder;
152
144
  }
145
+ if (typeof n === 'string') {
146
+ return n;
147
+ }
153
148
  const { sign, body } = signAndBody(n, decimals, locale, false, rounding, true);
154
149
  return `${sign}${body}%`;
155
150
  }
@@ -165,13 +160,16 @@ export function formatSignedPercent(value, options = {}) {
165
160
  */
166
161
  export function formatPrice(value, options = {}) {
167
162
  const { placeholder = DEFAULT_PLACEHOLDER, locale, rounding = 'halfUp', } = options;
168
- const n = toFiniteNumber(value);
163
+ const n = toBig(value);
169
164
  if (n === null) {
170
165
  return placeholder;
171
166
  }
172
- const abs = Math.abs(n);
167
+ if (typeof n === 'string') {
168
+ return n;
169
+ }
170
+ const abs = n.abs();
173
171
  const decimals = options.decimals ?? autoDecimals(abs);
174
- const { sign, body } = signAndBody(n, decimals, locale, abs >= 1000, rounding, false);
172
+ const { sign, body } = signAndBody(n, decimals, locale, abs.gte(1000), rounding, false);
175
173
  return `${sign}$${body}`;
176
174
  }
177
175
  /**
@@ -185,20 +183,23 @@ export function formatPrice(value, options = {}) {
185
183
  */
186
184
  export function formatCompactUsd(value, options = {}) {
187
185
  const { decimals = 2, placeholder = DEFAULT_PLACEHOLDER } = options;
188
- const n = toFiniteNumber(value);
186
+ const n = toBig(value);
189
187
  if (n === null) {
190
188
  return placeholder;
191
189
  }
192
- const sign = n < 0 ? '-' : '';
193
- const abs = Math.abs(n);
194
- if (abs >= 1_000_000_000) {
195
- return `${sign}$${(abs / 1_000_000_000).toFixed(decimals)}B`;
190
+ if (typeof n === 'string') {
191
+ return n;
192
+ }
193
+ const sign = n.lt(0) ? '-' : '';
194
+ const abs = n.abs();
195
+ if (abs.gte(1_000_000_000)) {
196
+ return `${sign}$${abs.div(1_000_000_000).toFixed(decimals)}B`;
196
197
  }
197
- if (abs >= 1_000_000) {
198
- return `${sign}$${(abs / 1_000_000).toFixed(decimals)}M`;
198
+ if (abs.gte(1_000_000)) {
199
+ return `${sign}$${abs.div(1_000_000).toFixed(decimals)}M`;
199
200
  }
200
- if (abs >= 1_000) {
201
- return `${sign}$${(abs / 1_000).toFixed(decimals)}K`;
201
+ if (abs.gte(1_000)) {
202
+ return `${sign}$${abs.div(1_000).toFixed(decimals)}K`;
202
203
  }
203
204
  return `${sign}$${abs.toFixed(decimals)}`;
204
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/decimal/format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../../src/decimal/format.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,35 @@
1
- import { type DecimalString } from '@lifi/perps-types';
2
1
  /**
3
- * Parse an optional decimal field, tolerating currency symbols, grouping
4
- * separators and a percentage suffix around the number.
5
- * Gives back `undefined` for a missing, malformed or non-finite value, and `0` for an empty string.
2
+ * Read a decimal string as a JS float, for a chart or pixel value only. A
3
+ * float holds about 15 significant digits, so the result can lose precision;
4
+ * never use it for an amount sent to a venue.
6
5
  *
6
+ * @throws {PerpsError} `ValidationError` when `value` is not a decimal string
7
+ * or is too large for a finite float.
7
8
  * @public
8
9
  */
9
- export declare function parseDecimal(value: DecimalString | string | null | undefined): number | undefined;
10
+ export declare function decimalStringToNumber(value: string): number;
10
11
  /**
11
- * Narrows an unknown value to a {@link DecimalString}.
12
+ * {@link decimalStringToNumber}, or `undefined` with a warning when it throws.
12
13
  *
13
14
  * @public
14
15
  */
15
- export declare function isDecimalString(value: unknown): value is DecimalString;
16
+ export declare const safeDecimalStringToNumber: (value: string) => number | undefined;
16
17
  /**
17
- * Check a decimal input against the {@link DecimalString} contract, naming
18
- * the field it came from, so a malformed amount fails at the SDK boundary
19
- * instead of inside big.js.
18
+ * Narrows an unknown value to a {@link DecimalString}. No characters are
19
+ * removed first.
20
20
  *
21
- * @returns `value`, unchanged.
22
- * @throws {PerpsError} `ValidationError` naming `field`.
23
21
  * @public
24
22
  */
25
- export declare function validateDecimalString(value: DecimalString, field: string): DecimalString;
23
+ export declare function isDecimalString(value: unknown): value is string;
24
+ /**
25
+ * Read a venue value (a string or a number) as a decimal string, for a
26
+ * money-path value that must not go on wrong. A number or an exponent string
27
+ * is spelled out in full; no `$`, `%` or `,` is removed.
28
+ *
29
+ * @param tool - Provider key set on the error.
30
+ * @throws {PerpsError} `SDKError` naming `field` when `value` is not a finite
31
+ * decimal.
32
+ * @public
33
+ */
34
+ export declare function unknownToDecimalString(value: unknown, field: string, tool: string): string;
26
35
  //# sourceMappingURL=parse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/decimal/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EAEnB,MAAM,mBAAmB,CAAA;AA8B1B;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/C,MAAM,GAAG,SAAS,CAYpB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAEtE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,GACZ,aAAa,CAQf"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/decimal/parse.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAS3D;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,uCAGrC,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE/D;AA2BD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,MAAM,CAWR"}