@velocity-exchange/sdk 0.4.0 → 0.6.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 (323) hide show
  1. package/README.md +3 -3
  2. package/lib/browser/adminClient.d.ts +35 -0
  3. package/lib/browser/adminClient.js +65 -0
  4. package/lib/browser/config.js +6 -7
  5. package/lib/browser/constants/numericConstants.d.ts +1 -1
  6. package/lib/browser/constants/numericConstants.js +1 -1
  7. package/lib/browser/decode/user.js +5 -1
  8. package/lib/browser/idl/velocity.d.ts +146 -3
  9. package/lib/browser/idl/velocity.json +147 -4
  10. package/lib/browser/orderSubscriber/OrderSubscriber.js +3 -0
  11. package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
  12. package/lib/browser/types.d.ts +4 -0
  13. package/lib/browser/user.d.ts +15 -0
  14. package/lib/browser/user.js +37 -1
  15. package/lib/browser/velocityClient.d.ts +46 -10
  16. package/lib/browser/velocityClient.js +107 -35
  17. package/lib/node/adminClient.d.ts +35 -0
  18. package/lib/node/adminClient.d.ts.map +1 -1
  19. package/lib/node/adminClient.js +65 -0
  20. package/lib/node/config.d.ts.map +1 -1
  21. package/lib/node/config.js +6 -7
  22. package/lib/node/constants/numericConstants.d.ts +1 -1
  23. package/lib/node/constants/numericConstants.d.ts.map +1 -1
  24. package/lib/node/constants/numericConstants.js +1 -1
  25. package/lib/node/decode/user.d.ts.map +1 -1
  26. package/lib/node/decode/user.js +5 -1
  27. package/lib/node/idl/velocity.d.ts +146 -3
  28. package/lib/node/idl/velocity.d.ts.map +1 -1
  29. package/lib/node/idl/velocity.json +147 -4
  30. package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
  31. package/lib/node/orderSubscriber/OrderSubscriber.js +3 -0
  32. package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
  33. package/lib/node/pyth/pythLazerSubscriber.js +37 -27
  34. package/lib/node/types.d.ts +4 -0
  35. package/lib/node/types.d.ts.map +1 -1
  36. package/lib/node/user.d.ts +15 -0
  37. package/lib/node/user.d.ts.map +1 -1
  38. package/lib/node/user.js +37 -1
  39. package/lib/node/velocityClient.d.ts +46 -10
  40. package/lib/node/velocityClient.d.ts.map +1 -1
  41. package/lib/node/velocityClient.js +107 -35
  42. package/package.json +7 -3
  43. package/.prettierignore +0 -1
  44. package/CHANGELOG.md +0 -132
  45. package/build-browser.js +0 -58
  46. package/bunfig.toml +0 -3
  47. package/esbuild-shims.js +0 -12
  48. package/scripts/deposit-isolated-positions.ts +0 -110
  49. package/scripts/find-flagged-users.ts +0 -213
  50. package/scripts/grpc-client-test-comparison.ts +0 -372
  51. package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
  52. package/scripts/postbuild.js +0 -95
  53. package/scripts/single-grpc-client-test.ts +0 -284
  54. package/scripts/withdraw-isolated-positions.ts +0 -174
  55. package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
  56. package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
  57. package/src/accounts/basicUserAccountSubscriber.ts +0 -79
  58. package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
  59. package/src/accounts/bulkAccountLoader.ts +0 -358
  60. package/src/accounts/bulkUserStatsSubscription.ts +0 -40
  61. package/src/accounts/bulkUserSubscription.ts +0 -39
  62. package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
  63. package/src/accounts/fetch.ts +0 -200
  64. package/src/accounts/grpcAccountSubscriber.ts +0 -225
  65. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
  66. package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
  67. package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
  68. package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
  69. package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
  70. package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
  71. package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
  72. package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
  73. package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
  74. package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
  75. package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
  76. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
  77. package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
  78. package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
  79. package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
  80. package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
  81. package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
  82. package/src/accounts/testBulkAccountLoader.ts +0 -59
  83. package/src/accounts/types.ts +0 -428
  84. package/src/accounts/utils.ts +0 -90
  85. package/src/accounts/webSocketAccountSubscriber.ts +0 -304
  86. package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
  87. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
  88. package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
  89. package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
  90. package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
  91. package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
  92. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
  93. package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
  94. package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
  95. package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
  96. package/src/addresses/marketAddresses.ts +0 -28
  97. package/src/addresses/pda.ts +0 -620
  98. package/src/adminClient.ts +0 -8136
  99. package/src/assert/assert.ts +0 -5
  100. package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
  101. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
  102. package/src/auctionSubscriber/index.ts +0 -9
  103. package/src/auctionSubscriber/types.ts +0 -30
  104. package/src/bankrun/bankrunConnection.ts +0 -630
  105. package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
  106. package/src/blockhashSubscriber/index.ts +0 -6
  107. package/src/blockhashSubscriber/types.ts +0 -13
  108. package/src/clock/clockSubscriber.ts +0 -146
  109. package/src/config.ts +0 -312
  110. package/src/constants/index.ts +0 -9
  111. package/src/constants/numericConstants.ts +0 -194
  112. package/src/constants/perpMarkets.ts +0 -127
  113. package/src/constants/spotMarkets.ts +0 -104
  114. package/src/constants/txConstants.ts +0 -2
  115. package/src/constituentMap/constituentMap.ts +0 -305
  116. package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
  117. package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
  118. package/src/core/VelocityCore.ts +0 -606
  119. package/src/core/index.ts +0 -12
  120. package/src/core/instructions/deposit.ts +0 -64
  121. package/src/core/instructions/fill.ts +0 -51
  122. package/src/core/instructions/funding.ts +0 -33
  123. package/src/core/instructions/liquidation.ts +0 -55
  124. package/src/core/instructions/orders.ts +0 -84
  125. package/src/core/instructions/perpOrders.ts +0 -312
  126. package/src/core/instructions/settlement.ts +0 -40
  127. package/src/core/instructions/trigger.ts +0 -41
  128. package/src/core/instructions/withdraw.ts +0 -65
  129. package/src/core/remainingAccounts.ts +0 -320
  130. package/src/core/signedMsg.ts +0 -109
  131. package/src/decode/customCoder.ts +0 -148
  132. package/src/decode/user.ts +0 -401
  133. package/src/dlob/DLOB.ts +0 -2793
  134. package/src/dlob/DLOBNode.ts +0 -305
  135. package/src/dlob/DLOBSubscriber.ts +0 -269
  136. package/src/dlob/NodeList.ts +0 -244
  137. package/src/dlob/orderBookLevels.ts +0 -695
  138. package/src/dlob/types.ts +0 -37
  139. package/src/events/eventList.ts +0 -114
  140. package/src/events/eventSubscriber.ts +0 -521
  141. package/src/events/eventsServerLogProvider.ts +0 -189
  142. package/src/events/fetchLogs.ts +0 -219
  143. package/src/events/parse.ts +0 -271
  144. package/src/events/pollingLogProvider.ts +0 -113
  145. package/src/events/sort.ts +0 -51
  146. package/src/events/txEventCache.ts +0 -92
  147. package/src/events/types.ts +0 -337
  148. package/src/events/webSocketLogProvider.ts +0 -152
  149. package/src/factory/bigNum.ts +0 -709
  150. package/src/factory/oracleClient.ts +0 -73
  151. package/src/idl/pyth.json +0 -142
  152. package/src/idl/pyth.ts +0 -97
  153. package/src/idl/pyth_solana_receiver.json +0 -628
  154. package/src/idl/token_faucet.json +0 -229
  155. package/src/idl/token_faucet.ts +0 -197
  156. package/src/idl/velocity.json +0 -23974
  157. package/src/idl/velocity.ts +0 -23980
  158. package/src/index.ts +0 -150
  159. package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
  160. package/src/isomorphic/README.md +0 -19
  161. package/src/isomorphic/anchor.browser.ts +0 -44
  162. package/src/isomorphic/anchor.node.ts +0 -1
  163. package/src/isomorphic/anchor.ts +0 -1
  164. package/src/isomorphic/anchor29.browser.ts +0 -24
  165. package/src/isomorphic/anchor29.node.ts +0 -1
  166. package/src/isomorphic/anchor29.ts +0 -1
  167. package/src/isomorphic/grpc.browser.ts +0 -4
  168. package/src/isomorphic/grpc.node.ts +0 -130
  169. package/src/isomorphic/grpc.ts +0 -1
  170. package/src/jupiter/jupiterClient.ts +0 -502
  171. package/src/keypair.ts +0 -32
  172. package/src/margin/README.md +0 -138
  173. package/src/marginCalculation.ts +0 -407
  174. package/src/marinade/idl/idl.json +0 -1962
  175. package/src/marinade/index.ts +0 -73
  176. package/src/marinade/types.ts +0 -3925
  177. package/src/math/amm.ts +0 -1758
  178. package/src/math/auction.ts +0 -480
  179. package/src/math/bankruptcy.ts +0 -138
  180. package/src/math/builder.ts +0 -130
  181. package/src/math/conversion.ts +0 -45
  182. package/src/math/exchangeStatus.ts +0 -261
  183. package/src/math/funding.ts +0 -498
  184. package/src/math/insurance.ts +0 -171
  185. package/src/math/liquidation.ts +0 -433
  186. package/src/math/margin.ts +0 -327
  187. package/src/math/market.ts +0 -487
  188. package/src/math/oracles.ts +0 -477
  189. package/src/math/orders.ts +0 -500
  190. package/src/math/position.ts +0 -381
  191. package/src/math/repeg.ts +0 -223
  192. package/src/math/spotBalance.ts +0 -996
  193. package/src/math/spotMarket.ts +0 -115
  194. package/src/math/spotPosition.ts +0 -263
  195. package/src/math/state.ts +0 -71
  196. package/src/math/superStake.ts +0 -602
  197. package/src/math/tiers.ts +0 -73
  198. package/src/math/trade.ts +0 -879
  199. package/src/math/utils.ts +0 -183
  200. package/src/memcmp.ts +0 -279
  201. package/src/oracles/oracleClientCache.ts +0 -41
  202. package/src/oracles/oracleId.ts +0 -99
  203. package/src/oracles/prelaunchOracleClient.ts +0 -63
  204. package/src/oracles/pythClient.ts +0 -125
  205. package/src/oracles/pythLazerClient.ts +0 -141
  206. package/src/oracles/quoteAssetOracleClient.ts +0 -43
  207. package/src/oracles/strictOraclePrice.ts +0 -40
  208. package/src/oracles/types.ts +0 -82
  209. package/src/oracles/utils.ts +0 -45
  210. package/src/orderParams.ts +0 -117
  211. package/src/orderSubscriber/OrderSubscriber.ts +0 -378
  212. package/src/orderSubscriber/PollingSubscription.ts +0 -50
  213. package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
  214. package/src/orderSubscriber/grpcSubscription.ts +0 -155
  215. package/src/orderSubscriber/index.ts +0 -7
  216. package/src/orderSubscriber/types.ts +0 -64
  217. package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
  218. package/src/priorityFee/averageStrategy.ts +0 -13
  219. package/src/priorityFee/ewmaStrategy.ts +0 -51
  220. package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
  221. package/src/priorityFee/index.ts +0 -16
  222. package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
  223. package/src/priorityFee/maxStrategy.ts +0 -8
  224. package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
  225. package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
  226. package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
  227. package/src/priorityFee/types.ts +0 -82
  228. package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
  229. package/src/pyth/constants.ts +0 -9
  230. package/src/pyth/index.ts +0 -15
  231. package/src/pyth/pythLazerSubscriber.ts +0 -365
  232. package/src/pyth/types.ts +0 -4451
  233. package/src/pyth/utils.ts +0 -13
  234. package/src/slot/SlotSubscriber.ts +0 -126
  235. package/src/slot/SlothashSubscriber.ts +0 -163
  236. package/src/swap/UnifiedSwapClient.ts +0 -315
  237. package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
  238. package/src/swift/index.ts +0 -10
  239. package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
  240. package/src/swift/swiftOrderSubscriber.ts +0 -351
  241. package/src/testClient.ts +0 -42
  242. package/src/titan/titanClient.ts +0 -438
  243. package/src/token/index.ts +0 -13
  244. package/src/tokenFaucet.ts +0 -296
  245. package/src/tx/baseTxSender.ts +0 -651
  246. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
  247. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
  248. package/src/tx/blockhashFetcher/types.ts +0 -9
  249. package/src/tx/fastSingleTxSender.ts +0 -200
  250. package/src/tx/forwardOnlyTxSender.ts +0 -193
  251. package/src/tx/priorityFeeCalculator.ts +0 -117
  252. package/src/tx/reportTransactionError.ts +0 -176
  253. package/src/tx/retryTxSender.ts +0 -177
  254. package/src/tx/txHandler.ts +0 -1009
  255. package/src/tx/txParamProcessor.ts +0 -225
  256. package/src/tx/types.ts +0 -117
  257. package/src/tx/utils.ts +0 -133
  258. package/src/tx/whileValidTxSender.ts +0 -377
  259. package/src/types.ts +0 -2575
  260. package/src/user.ts +0 -5316
  261. package/src/userConfig.ts +0 -38
  262. package/src/userMap/PollingSubscription.ts +0 -61
  263. package/src/userMap/WebsocketSubscription.ts +0 -93
  264. package/src/userMap/grpcSubscription.ts +0 -93
  265. package/src/userMap/referrerMap.ts +0 -360
  266. package/src/userMap/revenueShareEscrowMap.ts +0 -342
  267. package/src/userMap/userMap.ts +0 -784
  268. package/src/userMap/userMapConfig.ts +0 -82
  269. package/src/userMap/userStatsMap.ts +0 -393
  270. package/src/userName.ts +0 -37
  271. package/src/userStats.ts +0 -159
  272. package/src/userStatsConfig.ts +0 -35
  273. package/src/util/TransactionConfirmationManager.ts +0 -333
  274. package/src/util/chainClock.ts +0 -65
  275. package/src/util/computeUnits.ts +0 -101
  276. package/src/util/digest.ts +0 -33
  277. package/src/util/ed25519Utils.ts +0 -95
  278. package/src/util/promiseTimeout.ts +0 -23
  279. package/src/velocityClient.ts +0 -14802
  280. package/src/velocityClientConfig.ts +0 -119
  281. package/src/wallet.ts +0 -91
  282. package/tests/VelocityCore/builder_escrow.test.ts +0 -121
  283. package/tests/VelocityCore/decode.test.ts +0 -16
  284. package/tests/VelocityCore/fill_trigger.test.ts +0 -73
  285. package/tests/VelocityCore/instructions.test.ts +0 -46
  286. package/tests/VelocityCore/pdas.test.ts +0 -30
  287. package/tests/VelocityCore/perp_orders.test.ts +0 -205
  288. package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
  289. package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
  290. package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
  291. package/tests/amm/test.ts +0 -2402
  292. package/tests/auctions/test.ts +0 -81
  293. package/tests/bn/test.ts +0 -355
  294. package/tests/builder/builderFee.test.ts +0 -42
  295. package/tests/ci/verifyConstants.ts +0 -393
  296. package/tests/decode/test.ts +0 -262
  297. package/tests/decode/userAccountBufferStrings.ts +0 -102
  298. package/tests/dlob/helpers.ts +0 -748
  299. package/tests/dlob/test.ts +0 -6969
  300. package/tests/dlob/tickSizeStandardization.ts +0 -545
  301. package/tests/events/parseLogsForCuUsage.ts +0 -139
  302. package/tests/exchangeStatus/test.ts +0 -45
  303. package/tests/insurance/test.ts +0 -40
  304. package/tests/liquidation/test.ts +0 -125
  305. package/tests/oracles/mmOracleGate.test.ts +0 -379
  306. package/tests/oracles/pythPegSnap.test.ts +0 -76
  307. package/tests/sdkParity/enumParity.test.ts +0 -84
  308. package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
  309. package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
  310. package/tests/spot/test.ts +0 -281
  311. package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
  312. package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
  313. package/tests/tx/priorityFeeCalculator.ts +0 -77
  314. package/tests/tx/priorityFeeStrategy.ts +0 -95
  315. package/tests/user/bankruptcy.ts +0 -165
  316. package/tests/user/feeAndWithdrawLimits.ts +0 -284
  317. package/tests/user/getMarginCalculation.ts +0 -586
  318. package/tests/user/helpers.ts +0 -184
  319. package/tests/user/liquidations.ts +0 -129
  320. package/tests/user/marginCalculations.test.ts +0 -321
  321. package/tests/user/test.ts +0 -833
  322. package/tsconfig.browser.json +0 -18
  323. package/tsconfig.json +0 -36
@@ -1,709 +0,0 @@
1
- import { BN } from '../isomorphic/anchor';
2
- import { assert } from '../assert/assert';
3
- import { ZERO } from './../constants/numericConstants';
4
-
5
- export class BigNum {
6
- val: BN;
7
- precision: BN;
8
-
9
- static delim = '.';
10
- static spacer = ',';
11
-
12
- public static setLocale(locale: string): void {
13
- BigNum.delim = (1.1).toLocaleString(locale).slice(1, 2) || '.';
14
- BigNum.spacer = (1000).toLocaleString(locale).slice(1, 2) || ',';
15
- }
16
-
17
- constructor(
18
- val: BN | number | string,
19
- precisionVal: BN | number | string = new BN(0)
20
- ) {
21
- this.val = new BN(val);
22
- this.precision = new BN(precisionVal);
23
- }
24
-
25
- private bigNumFromParam(bn: BigNum | BN) {
26
- return BN.isBN(bn) ? BigNum.from(bn) : bn;
27
- }
28
-
29
- public add(bn: BigNum): BigNum {
30
- assert(bn.precision.eq(this.precision), 'Adding unequal precisions');
31
-
32
- return BigNum.from(this.val.add(bn.val), this.precision);
33
- }
34
-
35
- public sub(bn: BigNum): BigNum {
36
- assert(bn.precision.eq(this.precision), 'Subtracting unequal precisions');
37
-
38
- return BigNum.from(this.val.sub(bn.val), this.precision);
39
- }
40
-
41
- public mul(bn: BigNum | BN): BigNum {
42
- const mulVal = this.bigNumFromParam(bn);
43
-
44
- return BigNum.from(
45
- this.val.mul(mulVal.val),
46
- this.precision.add(mulVal.precision)
47
- );
48
- }
49
-
50
- /**
51
- * Multiplies by another big number then scales the result down by the big number's precision so that we're in the same precision space
52
- * @param bn
53
- * @returns
54
- */
55
- public scalarMul(bn: BigNum | BN): BigNum {
56
- if (BN.isBN(bn)) return BigNum.from(this.val.mul(bn), this.precision);
57
-
58
- return BigNum.from(
59
- this.val.mul(bn.val),
60
- this.precision.add(bn.precision)
61
- ).shift(bn.precision.neg());
62
- }
63
-
64
- public div(bn: BigNum | BN): BigNum {
65
- if (BN.isBN(bn)) return BigNum.from(this.val.div(bn), this.precision);
66
-
67
- return BigNum.from(this.val.div(bn.val), this.precision.sub(bn.precision));
68
- }
69
-
70
- /**
71
- * Shift precision up or down
72
- * @param exponent
73
- * @param skipAdjustingPrecision
74
- * @returns
75
- */
76
- public shift(exponent: BN | number, skipAdjustingPrecision = false): BigNum {
77
- const shiftVal = typeof exponent === 'number' ? new BN(exponent) : exponent;
78
-
79
- return BigNum.from(
80
- shiftVal.isNeg()
81
- ? this.val.div(new BN(10).pow(shiftVal))
82
- : this.val.mul(new BN(10).pow(shiftVal)),
83
- skipAdjustingPrecision ? this.precision : this.precision.add(shiftVal)
84
- );
85
- }
86
-
87
- /**
88
- * Shift to a target precision
89
- * @param targetPrecision
90
- * @returns
91
- */
92
- public shiftTo(targetPrecision: BN): BigNum {
93
- return this.shift(targetPrecision.sub(this.precision));
94
- }
95
-
96
- /**
97
- * Scale the number by a fraction
98
- * @param numerator
99
- * @param denominator
100
- * @returns
101
- */
102
- public scale(numerator: BN | number, denominator: BN | number): BigNum {
103
- return this.mul(BigNum.from(new BN(numerator))).div(new BN(denominator));
104
- }
105
-
106
- public toPercentage(denominator: BigNum, precision: number): string {
107
- return this.shift(precision)
108
- .shift(2, true)
109
- .div(denominator)
110
- .toPrecision(precision);
111
- }
112
-
113
- public gt(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
114
- const comparisonVal = this.bigNumFromParam(bn);
115
-
116
- if (!ignorePrecision && !comparisonVal.eq(ZERO)) {
117
- assert(
118
- comparisonVal.precision.eq(this.precision),
119
- 'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
120
- );
121
- }
122
-
123
- return this.val.gt(comparisonVal.val);
124
- }
125
-
126
- public lt(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
127
- const comparisonVal = this.bigNumFromParam(bn);
128
-
129
- if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
130
- assert(
131
- comparisonVal.precision.eq(this.precision),
132
- 'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
133
- );
134
- }
135
-
136
- return this.val.lt(comparisonVal.val);
137
- }
138
-
139
- public gte(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
140
- const comparisonVal = this.bigNumFromParam(bn);
141
-
142
- if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
143
- assert(
144
- comparisonVal.precision.eq(this.precision),
145
- 'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
146
- );
147
- }
148
-
149
- return this.val.gte(comparisonVal.val);
150
- }
151
-
152
- public lte(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
153
- const comparisonVal = this.bigNumFromParam(bn);
154
-
155
- if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
156
- assert(
157
- comparisonVal.precision.eq(this.precision),
158
- 'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
159
- );
160
- }
161
-
162
- return this.val.lte(comparisonVal.val);
163
- }
164
-
165
- public eq(bn: BigNum | BN, ignorePrecision?: boolean): boolean {
166
- const comparisonVal = this.bigNumFromParam(bn);
167
-
168
- if (!ignorePrecision && !comparisonVal.val.eq(ZERO)) {
169
- assert(
170
- comparisonVal.precision.eq(this.precision),
171
- 'Trying to compare numbers with different precision. Yo can opt to ignore precision using the ignorePrecision parameter'
172
- );
173
- }
174
-
175
- return this.val.eq(comparisonVal.val);
176
- }
177
-
178
- public eqZero() {
179
- return this.val.eq(ZERO);
180
- }
181
-
182
- public gtZero() {
183
- return this.val.gt(ZERO);
184
- }
185
-
186
- public ltZero() {
187
- return this.val.lt(ZERO);
188
- }
189
-
190
- public gteZero() {
191
- return this.val.gte(ZERO);
192
- }
193
-
194
- public lteZero() {
195
- return this.val.lte(ZERO);
196
- }
197
-
198
- public abs(): BigNum {
199
- return new BigNum(this.val.abs(), this.precision);
200
- }
201
-
202
- public neg(): BigNum {
203
- return new BigNum(this.val.neg(), this.precision);
204
- }
205
-
206
- public toString = (base?: number | 'hex', length?: number): string =>
207
- this.val.toString(base, length);
208
-
209
- /**
210
- * Pretty print the underlying value in human-readable form. Depends on precision being correct for the output string to be correct
211
- * @returns
212
- */
213
- public print(): string {
214
- assert(
215
- this.precision.gte(ZERO),
216
- 'Tried to print a BN with precision lower than zero'
217
- );
218
-
219
- const isNeg = this.isNeg();
220
- const plainString = this.abs().toString();
221
- const precisionNum = this.precision.toNumber();
222
-
223
- // make a string with at least the precisionNum number of zeroes
224
- let printString = [
225
- ...Array(this.precision.toNumber()).fill(0),
226
- ...plainString.split(''),
227
- ].join('');
228
-
229
- // inject decimal
230
- printString =
231
- printString.substring(0, printString.length - precisionNum) +
232
- BigNum.delim +
233
- printString.substring(printString.length - precisionNum);
234
-
235
- // remove leading zeroes
236
- printString = printString.replace(/^0+/, '');
237
-
238
- // add zero if leading delim
239
- if (printString[0] === BigNum.delim) printString = `0${printString}`;
240
-
241
- // Add minus if negative
242
- if (isNeg) printString = `-${printString}`;
243
-
244
- // remove trailing delim
245
- if (printString[printString.length - 1] === BigNum.delim)
246
- printString = printString.slice(0, printString.length - 1);
247
-
248
- return printString;
249
- }
250
-
251
- public prettyPrint(
252
- useTradePrecision?: boolean,
253
- precisionOverride?: number,
254
- decimalOverride?: number
255
- ): string {
256
- const [leftSide, rightSide] = this.printShort(
257
- useTradePrecision,
258
- precisionOverride
259
- ).split(BigNum.delim);
260
-
261
- let formattedLeftSide = leftSide;
262
- let formattedRightSide: string | undefined = rightSide;
263
-
264
- // Apply decimal override if specified
265
- if (decimalOverride !== undefined) {
266
- if (decimalOverride === 0) {
267
- formattedRightSide = undefined;
268
- } else {
269
- // If no decimal part exists, create one with zeros
270
- const currentRightSide = rightSide || '';
271
- // Pad with zeros if needed or truncate if too long
272
- formattedRightSide = currentRightSide
273
- .padEnd(decimalOverride, '0')
274
- .substring(0, decimalOverride);
275
- }
276
- }
277
-
278
- const isNeg = formattedLeftSide.includes('-');
279
- if (isNeg) {
280
- formattedLeftSide = formattedLeftSide.replace('-', '');
281
- }
282
-
283
- let index = formattedLeftSide.length - 3;
284
-
285
- while (index >= 1) {
286
- const formattedLeftSideArray = formattedLeftSide.split('');
287
-
288
- formattedLeftSideArray.splice(index, 0, BigNum.spacer);
289
-
290
- formattedLeftSide = formattedLeftSideArray.join('');
291
-
292
- index -= 3;
293
- }
294
-
295
- return `${isNeg ? '-' : ''}${formattedLeftSide}${
296
- formattedRightSide ? `${BigNum.delim}${formattedRightSide}` : ''
297
- }`;
298
- }
299
-
300
- /**
301
- * Print and remove unnecessary trailing zeroes
302
- * @returns
303
- */
304
- public printShort(
305
- useTradePrecision?: boolean,
306
- precisionOverride?: number
307
- ): string {
308
- const printVal = precisionOverride
309
- ? this.toPrecision(precisionOverride)
310
- : useTradePrecision
311
- ? this.toTradePrecision()
312
- : this.print();
313
-
314
- if (!printVal.includes(BigNum.delim)) return printVal;
315
-
316
- return printVal.replace(/0+$/g, '').replace(/\.$/, '').replace(/,$/, '');
317
- }
318
-
319
- public debug() {
320
- console.log(
321
- `${this.toString()} | ${this.print()} | ${this.precision.toString()}`
322
- );
323
- }
324
-
325
- /**
326
- * Pretty print with the specified number of decimal places
327
- * @param fixedPrecision
328
- * @returns
329
- */
330
- public toFixed(fixedPrecision: number, rounded = false): string {
331
- if (rounded) {
332
- return this.toRounded(fixedPrecision).toFixed(fixedPrecision);
333
- }
334
-
335
- const printString = this.print();
336
-
337
- const [leftSide, rightSide] = printString.split(BigNum.delim);
338
-
339
- const filledRightSide = [
340
- ...(rightSide ?? '').slice(0, fixedPrecision),
341
- ...Array(fixedPrecision).fill('0'),
342
- ]
343
- .slice(0, fixedPrecision)
344
- .join('');
345
-
346
- return `${leftSide}${BigNum.delim}${filledRightSide}`;
347
- }
348
-
349
- private getZeroes(count: number) {
350
- return new Array(Math.max(count, 0)).fill('0').join('');
351
- }
352
-
353
- public toRounded(roundingPrecision: number) {
354
- const printString = this.toString();
355
-
356
- let shouldRoundUp = false;
357
-
358
- const roundingDigitChar = printString[roundingPrecision];
359
-
360
- if (roundingDigitChar) {
361
- const roundingDigitVal = Number(roundingDigitChar);
362
- if (roundingDigitVal >= 5) shouldRoundUp = true;
363
- }
364
-
365
- if (shouldRoundUp) {
366
- const valueWithRoundedPrecisionAdded = this.add(
367
- BigNum.from(
368
- new BN(10).pow(new BN(printString.length - roundingPrecision)),
369
- this.precision
370
- )
371
- );
372
-
373
- const roundedUpPrintString =
374
- valueWithRoundedPrecisionAdded.toString().slice(0, roundingPrecision) +
375
- this.getZeroes(printString.length - roundingPrecision);
376
-
377
- return BigNum.from(roundedUpPrintString, this.precision);
378
- } else {
379
- const roundedDownPrintString =
380
- printString.slice(0, roundingPrecision) +
381
- this.getZeroes(printString.length - roundingPrecision);
382
-
383
- return BigNum.from(roundedDownPrintString, this.precision);
384
- }
385
- }
386
-
387
- /**
388
- * Pretty print to the specified number of significant figures
389
- * @param fixedPrecision
390
- * @returns
391
- */
392
- public toPrecision(
393
- fixedPrecision: number,
394
- trailingZeroes = false,
395
- rounded = false
396
- ): string {
397
- if (rounded) {
398
- return this.toRounded(fixedPrecision).toPrecision(
399
- fixedPrecision,
400
- trailingZeroes
401
- );
402
- }
403
-
404
- const isNeg = this.isNeg();
405
- const printString = this.abs().print();
406
- const thisString = this.abs().toString();
407
-
408
- // Handle small numbers (those with leading zeros after decimal)
409
- if (printString.includes(BigNum.delim)) {
410
- const [leftSide, rightSide] = printString.split(BigNum.delim);
411
- if (leftSide === '0' && rightSide) {
412
- // Count leading zeros
413
- let leadingZeros = 0;
414
- for (let i = 0; i < rightSide.length; i++) {
415
- if (rightSide[i] === '0') {
416
- leadingZeros++;
417
- } else {
418
- break;
419
- }
420
- }
421
- // Get significant digits starting after leading zeros
422
- const significantPart = rightSide.slice(leadingZeros);
423
- let significantDigits = significantPart.slice(0, fixedPrecision);
424
-
425
- // Remove trailing zeros if not requested
426
- if (!trailingZeroes) {
427
- significantDigits = significantDigits.replace(/0+$/, '');
428
- }
429
-
430
- // Only return result if we have significant digits
431
- if (significantDigits.length > 0) {
432
- const result = `${isNeg ? '-' : ''}0${BigNum.delim}${rightSide.slice(
433
- 0,
434
- leadingZeros
435
- )}${significantDigits}`;
436
- return result;
437
- }
438
- }
439
- }
440
-
441
- let precisionPrintString = printString.slice(0, fixedPrecision + 1);
442
-
443
- if (
444
- !printString.includes(BigNum.delim) &&
445
- thisString.length < fixedPrecision
446
- ) {
447
- const precisionMismatch = fixedPrecision - thisString.length;
448
- return BigNum.from(
449
- (isNeg ? '-' : '') + thisString + this.getZeroes(precisionMismatch),
450
- precisionMismatch
451
- ).toPrecision(fixedPrecision, trailingZeroes);
452
- }
453
-
454
- if (
455
- !precisionPrintString.includes(BigNum.delim) ||
456
- precisionPrintString[precisionPrintString.length - 1] === BigNum.delim
457
- ) {
458
- precisionPrintString = printString.slice(0, fixedPrecision);
459
- }
460
-
461
- const pointsOfPrecision = precisionPrintString.replace(
462
- BigNum.delim,
463
- ''
464
- ).length;
465
-
466
- if (pointsOfPrecision < fixedPrecision) {
467
- precisionPrintString = [
468
- ...precisionPrintString.split(''),
469
- ...Array(fixedPrecision - pointsOfPrecision).fill('0'),
470
- ].join('');
471
- }
472
-
473
- if (!precisionPrintString.includes(BigNum.delim)) {
474
- const delimFullStringLocation = printString.indexOf(BigNum.delim);
475
-
476
- let skipExponent = false;
477
-
478
- if (delimFullStringLocation === -1) {
479
- // no decimal, not missing any precision
480
- skipExponent = true;
481
- }
482
-
483
- if (
484
- precisionPrintString[precisionPrintString.length - 1] === BigNum.delim
485
- ) {
486
- // decimal is at end of string, not missing any precision, do nothing
487
- skipExponent = true;
488
- }
489
-
490
- if (printString.indexOf(BigNum.delim) === fixedPrecision) {
491
- // decimal is at end of string, not missing any precision, do nothing
492
- skipExponent = true;
493
- }
494
-
495
- if (!skipExponent) {
496
- const exponent = delimFullStringLocation - fixedPrecision;
497
- if (trailingZeroes) {
498
- precisionPrintString = `${precisionPrintString}${Array(exponent)
499
- .fill('0')
500
- .join('')}`;
501
- } else {
502
- precisionPrintString = `${precisionPrintString}e${exponent}`;
503
- }
504
- }
505
- }
506
-
507
- return `${isNeg ? '-' : ''}${precisionPrintString}`;
508
- }
509
-
510
- public toTradePrecision(rounded = false): string {
511
- return this.toPrecision(6, true, rounded);
512
- }
513
-
514
- /**
515
- * Print dollar formatted value. Defaults to fixed decimals two unless a given precision is given.
516
- * @param useTradePrecision
517
- * @param precisionOverride
518
- * @returns
519
- */
520
- public toNotional(
521
- useTradePrecision?: boolean,
522
- precisionOverride?: number,
523
- decimalOverride?: number
524
- ): string {
525
- const prefix = `${this.lt(BigNum.zero()) ? `-` : ``}$`;
526
-
527
- const usingCustomPrecision =
528
- true && (useTradePrecision || precisionOverride || decimalOverride);
529
-
530
- let val = usingCustomPrecision
531
- ? this.prettyPrint(useTradePrecision, precisionOverride, decimalOverride)
532
- : BigNum.fromPrint(this.toFixed(2), new BN(2)).prettyPrint();
533
-
534
- // Append trailing zeroes out to 2 decimal places if not using custom precision
535
- if (!usingCustomPrecision) {
536
- const [_, rightSide] = val.split(BigNum.delim);
537
- const trailingLength = rightSide?.length ?? 0;
538
-
539
- if (trailingLength === 0) {
540
- val = `${val}${BigNum.delim}00`;
541
- } else if (trailingLength === 1) {
542
- val = `${val}0`;
543
- }
544
- }
545
-
546
- return `${prefix}${val.replace('-', '')}`;
547
- }
548
-
549
- public toMillified(
550
- precision = 3,
551
- rounded = false,
552
- type: 'financial' | 'scientific' = 'financial'
553
- ): string {
554
- if (rounded) {
555
- return this.toRounded(precision).toMillified(precision);
556
- }
557
-
558
- const isNeg = this.isNeg();
559
-
560
- const stringVal = this.abs().print();
561
-
562
- const [leftSide] = stringVal.split(BigNum.delim);
563
-
564
- if (!leftSide) {
565
- return this.shift(new BN(precision)).toPrecision(precision, true);
566
- }
567
-
568
- if (leftSide.length <= precision) {
569
- return this.toPrecision(precision);
570
- }
571
-
572
- if (leftSide.length <= 3) {
573
- return this.shift(new BN(precision)).toPrecision(precision, true);
574
- }
575
-
576
- const unitTicks =
577
- type === 'financial'
578
- ? ['', 'K', 'M', 'B', 'T', 'Q']
579
- : ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'];
580
- // TODO -- handle nubers which are larger than the max unit tick
581
-
582
- const unitNumber = Math.floor((leftSide.length - 1) / 3);
583
- const unit = unitTicks[unitNumber];
584
-
585
- let leadDigits = leftSide.slice(0, precision);
586
-
587
- if (leadDigits.length < precision) {
588
- leadDigits = [
589
- ...leadDigits.split(''),
590
- ...Array(precision - leadDigits.length).fill('0'),
591
- ].join('');
592
- }
593
-
594
- const decimalLocation = leftSide.length - 3 * unitNumber;
595
-
596
- let leadString = '';
597
-
598
- if (decimalLocation >= precision) {
599
- leadString = `${leadDigits}`;
600
- } else {
601
- leadString = `${leadDigits.slice(0, decimalLocation)}${
602
- BigNum.delim
603
- }${leadDigits.slice(decimalLocation)}`;
604
- }
605
-
606
- return `${isNeg ? '-' : ''}${leadString}${unit}`;
607
- }
608
-
609
- public toJSON() {
610
- return {
611
- val: this.val.toString(),
612
- precision: this.precision.toString(),
613
- };
614
- }
615
-
616
- public isNeg() {
617
- return this.lt(ZERO, true);
618
- }
619
-
620
- public isPos() {
621
- return !this.isNeg();
622
- }
623
-
624
- /**
625
- * Get the numerical value of the BigNum. This can break if the BigNum is too large.
626
- * @returns
627
- */
628
- public toNum() {
629
- let printedValue = this.print();
630
-
631
- // Must convert any non-US delimiters and spacers to US format before using parseFloat
632
- if (BigNum.delim !== '.' || BigNum.spacer !== ',') {
633
- printedValue = printedValue
634
- .split('')
635
- .map((char) => {
636
- if (char === BigNum.delim) return '.';
637
- if (char === BigNum.spacer) return ',';
638
- return char;
639
- })
640
- .join('');
641
- }
642
-
643
- return parseFloat(printedValue);
644
- }
645
-
646
- static fromJSON(json: { val: string; precision: string }) {
647
- return BigNum.from(new BN(json.val), new BN(json.precision));
648
- }
649
-
650
- /**
651
- * Create a BigNum instance
652
- * @param val
653
- * @param precision
654
- * @returns
655
- */
656
- static from(
657
- val: BN | number | string = ZERO,
658
- precision?: BN | number | string
659
- ): BigNum {
660
- assert(
661
- new BN(precision ?? 0).lt(new BN(100)),
662
- 'Tried to create a bignum with precision higher than 10^100'
663
- );
664
- return new BigNum(val, precision);
665
- }
666
-
667
- /**
668
- * Create a BigNum instance from a printed BigNum
669
- * @param val
670
- * @param precisionOverride
671
- * @returns
672
- */
673
- static fromPrint(val: string, precisionShift?: BN): BigNum {
674
- // Handle empty number edge cases
675
- if (!val) return BigNum.from(ZERO, precisionShift);
676
- if (!val.replace(BigNum.delim, '')) {
677
- return BigNum.from(ZERO, precisionShift);
678
- }
679
- if (val.includes('e'))
680
- val = (+val).toFixed(precisionShift?.toNumber() ?? 9); // prevent small numbers e.g. 3.1e-8, use assume max precision 9 as default
681
-
682
- const sides = val.split(BigNum.delim);
683
- const rightSide = sides[1];
684
- const leftSide = sides[0].replace(/\s/g, '');
685
- const bnInput = `${leftSide ?? ''}${rightSide ?? ''}`;
686
-
687
- const rawBn = new BN(bnInput);
688
-
689
- const rightSideLength = rightSide?.length ?? 0;
690
-
691
- const totalShift = precisionShift
692
- ? precisionShift.sub(new BN(rightSideLength))
693
- : ZERO;
694
-
695
- return BigNum.from(rawBn, precisionShift).shift(totalShift, true);
696
- }
697
-
698
- static max(a: BigNum, b: BigNum): BigNum {
699
- return a.gt(b) ? a : b;
700
- }
701
-
702
- static min(a: BigNum, b: BigNum): BigNum {
703
- return a.lt(b) ? a : b;
704
- }
705
-
706
- static zero(precision?: BN | number): BigNum {
707
- return BigNum.from(0, precision);
708
- }
709
- }