@velocity-exchange/sdk 0.4.0 → 0.6.1

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 (325) hide show
  1. package/README.md +3 -3
  2. package/lib/browser/adminClient.d.ts +52 -0
  3. package/lib/browser/adminClient.js +97 -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 +191 -15
  9. package/lib/browser/idl/velocity.json +192 -16
  10. package/lib/browser/orderSubscriber/OrderSubscriber.d.ts +1 -0
  11. package/lib/browser/orderSubscriber/OrderSubscriber.js +10 -4
  12. package/lib/browser/pyth/pythLazerSubscriber.js +37 -27
  13. package/lib/browser/types.d.ts +6 -0
  14. package/lib/browser/user.d.ts +20 -3
  15. package/lib/browser/user.js +52 -4
  16. package/lib/browser/velocityClient.d.ts +46 -10
  17. package/lib/browser/velocityClient.js +107 -35
  18. package/lib/node/adminClient.d.ts +52 -0
  19. package/lib/node/adminClient.d.ts.map +1 -1
  20. package/lib/node/adminClient.js +97 -0
  21. package/lib/node/config.d.ts.map +1 -1
  22. package/lib/node/config.js +6 -7
  23. package/lib/node/constants/numericConstants.d.ts +1 -1
  24. package/lib/node/constants/numericConstants.d.ts.map +1 -1
  25. package/lib/node/constants/numericConstants.js +1 -1
  26. package/lib/node/decode/user.d.ts.map +1 -1
  27. package/lib/node/decode/user.js +5 -1
  28. package/lib/node/idl/velocity.d.ts +191 -15
  29. package/lib/node/idl/velocity.d.ts.map +1 -1
  30. package/lib/node/idl/velocity.json +192 -16
  31. package/lib/node/orderSubscriber/OrderSubscriber.d.ts +1 -0
  32. package/lib/node/orderSubscriber/OrderSubscriber.d.ts.map +1 -1
  33. package/lib/node/orderSubscriber/OrderSubscriber.js +10 -4
  34. package/lib/node/pyth/pythLazerSubscriber.d.ts.map +1 -1
  35. package/lib/node/pyth/pythLazerSubscriber.js +37 -27
  36. package/lib/node/types.d.ts +6 -0
  37. package/lib/node/types.d.ts.map +1 -1
  38. package/lib/node/user.d.ts +20 -3
  39. package/lib/node/user.d.ts.map +1 -1
  40. package/lib/node/user.js +52 -4
  41. package/lib/node/velocityClient.d.ts +46 -10
  42. package/lib/node/velocityClient.d.ts.map +1 -1
  43. package/lib/node/velocityClient.js +107 -35
  44. package/package.json +7 -3
  45. package/.prettierignore +0 -1
  46. package/CHANGELOG.md +0 -132
  47. package/build-browser.js +0 -58
  48. package/bunfig.toml +0 -3
  49. package/esbuild-shims.js +0 -12
  50. package/scripts/deposit-isolated-positions.ts +0 -110
  51. package/scripts/find-flagged-users.ts +0 -213
  52. package/scripts/grpc-client-test-comparison.ts +0 -372
  53. package/scripts/grpc-multiuser-client-test-comparison.ts +0 -158
  54. package/scripts/postbuild.js +0 -95
  55. package/scripts/single-grpc-client-test.ts +0 -284
  56. package/scripts/withdraw-isolated-positions.ts +0 -174
  57. package/src/accounts/README_WebSocketAccountSubscriberV2.md +0 -95
  58. package/src/accounts/README_WebSocketProgramAccountSubscriberV2.md +0 -135
  59. package/src/accounts/basicUserAccountSubscriber.ts +0 -79
  60. package/src/accounts/basicUserStatsAccountSubscriber.ts +0 -87
  61. package/src/accounts/bulkAccountLoader.ts +0 -358
  62. package/src/accounts/bulkUserStatsSubscription.ts +0 -40
  63. package/src/accounts/bulkUserSubscription.ts +0 -39
  64. package/src/accounts/customizedCadenceBulkAccountLoader.ts +0 -250
  65. package/src/accounts/fetch.ts +0 -200
  66. package/src/accounts/grpcAccountSubscriber.ts +0 -225
  67. package/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +0 -73
  68. package/src/accounts/grpcMultiAccountSubscriber.ts +0 -566
  69. package/src/accounts/grpcMultiUserAccountSubscriber.ts +0 -328
  70. package/src/accounts/grpcProgramAccountSubscriber.ts +0 -264
  71. package/src/accounts/grpcUserAccountSubscriber.ts +0 -63
  72. package/src/accounts/grpcUserStatsAccountSubscriber.ts +0 -65
  73. package/src/accounts/grpcVelocityClientAccountSubscriber.ts +0 -257
  74. package/src/accounts/grpcVelocityClientAccountSubscriberV2.ts +0 -941
  75. package/src/accounts/laserProgramAccountSubscriber.ts +0 -266
  76. package/src/accounts/oneShotUserAccountSubscriber.ts +0 -88
  77. package/src/accounts/oneShotUserStatsAccountSubscriber.ts +0 -94
  78. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +0 -223
  79. package/src/accounts/pollingOracleAccountSubscriber.ts +0 -151
  80. package/src/accounts/pollingTokenAccountSubscriber.ts +0 -147
  81. package/src/accounts/pollingUserAccountSubscriber.ts +0 -198
  82. package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -180
  83. package/src/accounts/pollingVelocityClientAccountSubscriber.ts +0 -774
  84. package/src/accounts/testBulkAccountLoader.ts +0 -59
  85. package/src/accounts/types.ts +0 -428
  86. package/src/accounts/utils.ts +0 -90
  87. package/src/accounts/webSocketAccountSubscriber.ts +0 -304
  88. package/src/accounts/webSocketAccountSubscriberV2.ts +0 -536
  89. package/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +0 -171
  90. package/src/accounts/webSocketProgramAccountSubscriber.ts +0 -244
  91. package/src/accounts/webSocketProgramAccountSubscriberV2.ts +0 -1048
  92. package/src/accounts/webSocketProgramAccountsSubscriberV2.ts +0 -1042
  93. package/src/accounts/webSocketUserAccountSubscriber.ts +0 -139
  94. package/src/accounts/webSocketUserStatsAccountSubsriber.ts +0 -131
  95. package/src/accounts/webSocketVelocityClientAccountSubscriber.ts +0 -865
  96. package/src/accounts/webSocketVelocityClientAccountSubscriberV2.ts +0 -897
  97. package/src/accounts/websocketProgramUserAccountSubscriber.ts +0 -127
  98. package/src/addresses/marketAddresses.ts +0 -28
  99. package/src/addresses/pda.ts +0 -620
  100. package/src/adminClient.ts +0 -8136
  101. package/src/assert/assert.ts +0 -5
  102. package/src/auctionSubscriber/auctionSubscriber.ts +0 -86
  103. package/src/auctionSubscriber/auctionSubscriberGrpc.ts +0 -99
  104. package/src/auctionSubscriber/index.ts +0 -9
  105. package/src/auctionSubscriber/types.ts +0 -30
  106. package/src/bankrun/bankrunConnection.ts +0 -630
  107. package/src/blockhashSubscriber/BlockhashSubscriber.ts +0 -160
  108. package/src/blockhashSubscriber/index.ts +0 -6
  109. package/src/blockhashSubscriber/types.ts +0 -13
  110. package/src/clock/clockSubscriber.ts +0 -146
  111. package/src/config.ts +0 -312
  112. package/src/constants/index.ts +0 -9
  113. package/src/constants/numericConstants.ts +0 -194
  114. package/src/constants/perpMarkets.ts +0 -127
  115. package/src/constants/spotMarkets.ts +0 -104
  116. package/src/constants/txConstants.ts +0 -2
  117. package/src/constituentMap/constituentMap.ts +0 -305
  118. package/src/constituentMap/pollingConstituentAccountSubscriber.ts +0 -99
  119. package/src/constituentMap/webSocketConstituentAccountSubscriber.ts +0 -121
  120. package/src/core/VelocityCore.ts +0 -606
  121. package/src/core/index.ts +0 -12
  122. package/src/core/instructions/deposit.ts +0 -64
  123. package/src/core/instructions/fill.ts +0 -51
  124. package/src/core/instructions/funding.ts +0 -33
  125. package/src/core/instructions/liquidation.ts +0 -55
  126. package/src/core/instructions/orders.ts +0 -84
  127. package/src/core/instructions/perpOrders.ts +0 -312
  128. package/src/core/instructions/settlement.ts +0 -40
  129. package/src/core/instructions/trigger.ts +0 -41
  130. package/src/core/instructions/withdraw.ts +0 -65
  131. package/src/core/remainingAccounts.ts +0 -320
  132. package/src/core/signedMsg.ts +0 -109
  133. package/src/decode/customCoder.ts +0 -148
  134. package/src/decode/user.ts +0 -401
  135. package/src/dlob/DLOB.ts +0 -2793
  136. package/src/dlob/DLOBNode.ts +0 -305
  137. package/src/dlob/DLOBSubscriber.ts +0 -269
  138. package/src/dlob/NodeList.ts +0 -244
  139. package/src/dlob/orderBookLevels.ts +0 -695
  140. package/src/dlob/types.ts +0 -37
  141. package/src/events/eventList.ts +0 -114
  142. package/src/events/eventSubscriber.ts +0 -521
  143. package/src/events/eventsServerLogProvider.ts +0 -189
  144. package/src/events/fetchLogs.ts +0 -219
  145. package/src/events/parse.ts +0 -271
  146. package/src/events/pollingLogProvider.ts +0 -113
  147. package/src/events/sort.ts +0 -51
  148. package/src/events/txEventCache.ts +0 -92
  149. package/src/events/types.ts +0 -337
  150. package/src/events/webSocketLogProvider.ts +0 -152
  151. package/src/factory/bigNum.ts +0 -709
  152. package/src/factory/oracleClient.ts +0 -73
  153. package/src/idl/pyth.json +0 -142
  154. package/src/idl/pyth.ts +0 -97
  155. package/src/idl/pyth_solana_receiver.json +0 -628
  156. package/src/idl/token_faucet.json +0 -229
  157. package/src/idl/token_faucet.ts +0 -197
  158. package/src/idl/velocity.json +0 -23974
  159. package/src/idl/velocity.ts +0 -23980
  160. package/src/index.ts +0 -150
  161. package/src/indicative-quotes/indicativeQuotesSender.ts +0 -233
  162. package/src/isomorphic/README.md +0 -19
  163. package/src/isomorphic/anchor.browser.ts +0 -44
  164. package/src/isomorphic/anchor.node.ts +0 -1
  165. package/src/isomorphic/anchor.ts +0 -1
  166. package/src/isomorphic/anchor29.browser.ts +0 -24
  167. package/src/isomorphic/anchor29.node.ts +0 -1
  168. package/src/isomorphic/anchor29.ts +0 -1
  169. package/src/isomorphic/grpc.browser.ts +0 -4
  170. package/src/isomorphic/grpc.node.ts +0 -130
  171. package/src/isomorphic/grpc.ts +0 -1
  172. package/src/jupiter/jupiterClient.ts +0 -502
  173. package/src/keypair.ts +0 -32
  174. package/src/margin/README.md +0 -138
  175. package/src/marginCalculation.ts +0 -407
  176. package/src/marinade/idl/idl.json +0 -1962
  177. package/src/marinade/index.ts +0 -73
  178. package/src/marinade/types.ts +0 -3925
  179. package/src/math/amm.ts +0 -1758
  180. package/src/math/auction.ts +0 -480
  181. package/src/math/bankruptcy.ts +0 -138
  182. package/src/math/builder.ts +0 -130
  183. package/src/math/conversion.ts +0 -45
  184. package/src/math/exchangeStatus.ts +0 -261
  185. package/src/math/funding.ts +0 -498
  186. package/src/math/insurance.ts +0 -171
  187. package/src/math/liquidation.ts +0 -433
  188. package/src/math/margin.ts +0 -327
  189. package/src/math/market.ts +0 -487
  190. package/src/math/oracles.ts +0 -477
  191. package/src/math/orders.ts +0 -500
  192. package/src/math/position.ts +0 -381
  193. package/src/math/repeg.ts +0 -223
  194. package/src/math/spotBalance.ts +0 -996
  195. package/src/math/spotMarket.ts +0 -115
  196. package/src/math/spotPosition.ts +0 -263
  197. package/src/math/state.ts +0 -71
  198. package/src/math/superStake.ts +0 -602
  199. package/src/math/tiers.ts +0 -73
  200. package/src/math/trade.ts +0 -879
  201. package/src/math/utils.ts +0 -183
  202. package/src/memcmp.ts +0 -279
  203. package/src/oracles/oracleClientCache.ts +0 -41
  204. package/src/oracles/oracleId.ts +0 -99
  205. package/src/oracles/prelaunchOracleClient.ts +0 -63
  206. package/src/oracles/pythClient.ts +0 -125
  207. package/src/oracles/pythLazerClient.ts +0 -141
  208. package/src/oracles/quoteAssetOracleClient.ts +0 -43
  209. package/src/oracles/strictOraclePrice.ts +0 -40
  210. package/src/oracles/types.ts +0 -82
  211. package/src/oracles/utils.ts +0 -45
  212. package/src/orderParams.ts +0 -117
  213. package/src/orderSubscriber/OrderSubscriber.ts +0 -378
  214. package/src/orderSubscriber/PollingSubscription.ts +0 -50
  215. package/src/orderSubscriber/WebsocketSubscription.ts +0 -137
  216. package/src/orderSubscriber/grpcSubscription.ts +0 -155
  217. package/src/orderSubscriber/index.ts +0 -7
  218. package/src/orderSubscriber/types.ts +0 -64
  219. package/src/priorityFee/averageOverSlotsStrategy.ts +0 -17
  220. package/src/priorityFee/averageStrategy.ts +0 -13
  221. package/src/priorityFee/ewmaStrategy.ts +0 -51
  222. package/src/priorityFee/heliusPriorityFeeMethod.ts +0 -68
  223. package/src/priorityFee/index.ts +0 -16
  224. package/src/priorityFee/maxOverSlotsStrategy.ts +0 -18
  225. package/src/priorityFee/maxStrategy.ts +0 -8
  226. package/src/priorityFee/priorityFeeSubscriber.ts +0 -328
  227. package/src/priorityFee/priorityFeeSubscriberMap.ts +0 -134
  228. package/src/priorityFee/solanaPriorityFeeMethod.ts +0 -46
  229. package/src/priorityFee/types.ts +0 -82
  230. package/src/priorityFee/velocityPriorityFeeMethod.ts +0 -53
  231. package/src/pyth/constants.ts +0 -9
  232. package/src/pyth/index.ts +0 -15
  233. package/src/pyth/pythLazerSubscriber.ts +0 -365
  234. package/src/pyth/types.ts +0 -4451
  235. package/src/pyth/utils.ts +0 -13
  236. package/src/slot/SlotSubscriber.ts +0 -126
  237. package/src/slot/SlothashSubscriber.ts +0 -163
  238. package/src/swap/UnifiedSwapClient.ts +0 -315
  239. package/src/swift/grpcSignedMsgUserAccountSubscriber.ts +0 -81
  240. package/src/swift/index.ts +0 -10
  241. package/src/swift/signedMsgUserAccountSubscriber.ts +0 -251
  242. package/src/swift/swiftOrderSubscriber.ts +0 -351
  243. package/src/testClient.ts +0 -42
  244. package/src/titan/titanClient.ts +0 -438
  245. package/src/token/index.ts +0 -13
  246. package/src/tokenFaucet.ts +0 -296
  247. package/src/tx/baseTxSender.ts +0 -651
  248. package/src/tx/blockhashFetcher/baseBlockhashFetcher.ts +0 -31
  249. package/src/tx/blockhashFetcher/cachedBlockhashFetcher.ts +0 -105
  250. package/src/tx/blockhashFetcher/types.ts +0 -9
  251. package/src/tx/fastSingleTxSender.ts +0 -200
  252. package/src/tx/forwardOnlyTxSender.ts +0 -193
  253. package/src/tx/priorityFeeCalculator.ts +0 -117
  254. package/src/tx/reportTransactionError.ts +0 -176
  255. package/src/tx/retryTxSender.ts +0 -177
  256. package/src/tx/txHandler.ts +0 -1009
  257. package/src/tx/txParamProcessor.ts +0 -225
  258. package/src/tx/types.ts +0 -117
  259. package/src/tx/utils.ts +0 -133
  260. package/src/tx/whileValidTxSender.ts +0 -377
  261. package/src/types.ts +0 -2575
  262. package/src/user.ts +0 -5316
  263. package/src/userConfig.ts +0 -38
  264. package/src/userMap/PollingSubscription.ts +0 -61
  265. package/src/userMap/WebsocketSubscription.ts +0 -93
  266. package/src/userMap/grpcSubscription.ts +0 -93
  267. package/src/userMap/referrerMap.ts +0 -360
  268. package/src/userMap/revenueShareEscrowMap.ts +0 -342
  269. package/src/userMap/userMap.ts +0 -784
  270. package/src/userMap/userMapConfig.ts +0 -82
  271. package/src/userMap/userStatsMap.ts +0 -393
  272. package/src/userName.ts +0 -37
  273. package/src/userStats.ts +0 -159
  274. package/src/userStatsConfig.ts +0 -35
  275. package/src/util/TransactionConfirmationManager.ts +0 -333
  276. package/src/util/chainClock.ts +0 -65
  277. package/src/util/computeUnits.ts +0 -101
  278. package/src/util/digest.ts +0 -33
  279. package/src/util/ed25519Utils.ts +0 -95
  280. package/src/util/promiseTimeout.ts +0 -23
  281. package/src/velocityClient.ts +0 -14802
  282. package/src/velocityClientConfig.ts +0 -119
  283. package/src/wallet.ts +0 -91
  284. package/tests/VelocityCore/builder_escrow.test.ts +0 -121
  285. package/tests/VelocityCore/decode.test.ts +0 -16
  286. package/tests/VelocityCore/fill_trigger.test.ts +0 -73
  287. package/tests/VelocityCore/instructions.test.ts +0 -46
  288. package/tests/VelocityCore/pdas.test.ts +0 -30
  289. package/tests/VelocityCore/perp_orders.test.ts +0 -205
  290. package/tests/VelocityCore/remainingAccounts.test.ts +0 -72
  291. package/tests/VelocityCore/settlement_liquidation.test.ts +0 -69
  292. package/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +0 -211
  293. package/tests/amm/test.ts +0 -2402
  294. package/tests/auctions/test.ts +0 -81
  295. package/tests/bn/test.ts +0 -355
  296. package/tests/builder/builderFee.test.ts +0 -42
  297. package/tests/ci/verifyConstants.ts +0 -393
  298. package/tests/decode/test.ts +0 -262
  299. package/tests/decode/userAccountBufferStrings.ts +0 -102
  300. package/tests/dlob/helpers.ts +0 -748
  301. package/tests/dlob/test.ts +0 -6969
  302. package/tests/dlob/tickSizeStandardization.ts +0 -545
  303. package/tests/events/parseLogsForCuUsage.ts +0 -139
  304. package/tests/exchangeStatus/test.ts +0 -45
  305. package/tests/insurance/test.ts +0 -40
  306. package/tests/liquidation/test.ts +0 -125
  307. package/tests/oracles/mmOracleGate.test.ts +0 -379
  308. package/tests/oracles/pythPegSnap.test.ts +0 -76
  309. package/tests/sdkParity/enumParity.test.ts +0 -84
  310. package/tests/sdkParity/marginCategoryFill.test.ts +0 -143
  311. package/tests/sdkParity/memcmpOffsets.test.ts +0 -139
  312. package/tests/spot/test.ts +0 -281
  313. package/tests/tx/TransactionConfirmationManager.test.ts +0 -312
  314. package/tests/tx/cachedBlockhashFetcher.test.ts +0 -96
  315. package/tests/tx/priorityFeeCalculator.ts +0 -77
  316. package/tests/tx/priorityFeeStrategy.ts +0 -95
  317. package/tests/user/bankruptcy.ts +0 -165
  318. package/tests/user/feeAndWithdrawLimits.ts +0 -284
  319. package/tests/user/getMarginCalculation.ts +0 -586
  320. package/tests/user/helpers.ts +0 -184
  321. package/tests/user/liquidations.ts +0 -129
  322. package/tests/user/marginCalculations.test.ts +0 -321
  323. package/tests/user/test.ts +0 -833
  324. package/tsconfig.browser.json +0 -18
  325. 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
- }